Oracle
 sql >> база данни >  >> RDS >> Oracle

Разделете стойностите, разделени със запетая, на колони в Oracle

Внимавай! Изразът на regexp_substr във формат '[^,]+' няма да върне очакваната стойност, ако има нулев елемент в списъка и искате този елемент или един след него. Помислете за този пример, където 4-ти елемент е NULL и искам 5-ти елемент и по този начин очаквам '5' да бъде върнат:

SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;

R
-
6

Изненада! Връща 5-тия NON-NULL елемент, а не действителния 5-ти елемент! Върнати са неправилни данни и може дори да не ги хванете. Опитайте това вместо това:

SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;

R
-
5

И така, коригираният по-горе REGEXP_SUBSTR казва да се търси 5-то появяване на 0 или повече символа, разделени със запетая, последвано от запетая или края на реда (позволява следващия разделител, било то запетая или края на реда) и когато бъде намерен, върнете първата подгрупа (данните НЕ включват запетаята или края на реда).

Моделът за търсене съвпада '(.*?)(,|$)' обясни:

(             = Start a group
.             = match any character
*             = 0 or more matches of the preceding character
?             = Match 0 or 1 occurrences of the preceding pattern
)             = End the 1st group
(             = Start a new group (also used for logical OR)
,             = comma
|             = OR
$             = End of the line
)             = End the 2nd group

РЕДАКТИРАНЕ:Добавена е повече информация и опростен регулярният израз.

Вижте тази публикация за повече информация и предложение да капсулирате това във функция за лесна повторна употреба:REGEX за избор на n-та стойност от списък, позволявайки nulls. Това е публикацията, в която открих формата '[^,]+' има проблема. За съжаление това е форматът на регулярни изрази, който най-често ще виждате като отговор на въпроси относно това как да анализирате списък. Настръхвам като си помисля за всички неправилни данни, които се връщат от '[^,]+' !



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Достъп до уеб услугата от съхранената процедура на Oracle

  2. Как да настроите региона на часовата зона за JDBC Connection и да избегнете SqlException регионът на часовата зона не е намерен?

  3. Добавете 2 месеца към текущото времеви печат

  4. Автоматично увеличение за Oracle

  5. Разширете EM Grid Control до нови възли