Oracle: подключение по уровню & regexp_substr - PullRequest
0 голосов
/ 21 декабря 2018

Привет, у меня есть запрос Oracle, который я не написал, и у меня также нет доступа для запуска в среде Oracle.

Может кто-нибудь объяснить, пожалуйста, что делает этот запрос?

WITH tableName AS 
( SELECT regexp_substr(fieldName,'[^,]+',1,level) as tableName 
  FROM   (SELECT :tableName as fieldName From DUAL) 
  CONNECT BY LEVEL <= REGEXP_COUNT(fieldName ,'[,]')+1 )

Я понимаю, что он создает CTE с именем tableName и что Oracle позволяет указывать DUAL в виде таблицы в запросах.которые не нуждаются в данных из каких-либо таблиц.ТАК, что вышеупомянутый запрос не извлекается из какой-либо конкретной таблицы.

Однако остальную часть запроса я не понимаю, поскольку я очень новичок в Oracle.

Любая помощь будет принята с благодарностью.попробовал поискать в Google, но ничего не вышло.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Предупреждение: синтаксический анализ строки с использованием общего регулярного выражения '[^,]+' не возвращает ожидаемое значение, если в списке есть элемент NULL.Элементы будут в неправильном положении после элемента NULL.Обратите внимание, что второй элемент имеет значение NULL, но в результирующем наборе элементы возвращаются в неправильных местах:

SQL> select level, regexp_substr('emp,,bonus,salgrade','[^,]+',1,level) as tableName
       from dual
       connect by LEVEL <= REGEXP_COUNT('emp,,bonus,salgrade' ,',') + 1;

     LEVEL TABLENAME
---------- -------------------
         1 emp
         2 bonus
         3 salgrade
         4

Используйте вместо этого эту форму REGXP_SUBSTR (), которая обрабатывает NULL:

SQL> select level, regexp_substr('emp,,bonus,salgrade','(.*?)(,|$)',1,level, NULL, 1) as tableName
       from dual
       connect by LEVEL <= REGEXP_COUNT('emp,,bonus,salgrade' ,',') + 1;

     LEVEL TABLENAME
---------- -------------------
         1 emp
         2
         3 bonus
         4 salgrade

См. Этот пост для получения дополнительной информации

0 голосов
/ 21 декабря 2018

Разбивает строку значений через запятую на строки.Например (немного изменено, чтобы оно работало в SQL * Plus):

SQL> with tableName AS
  2   ( SELECT regexp_substr(fieldName,'[^,]+',1,level) as tableName
  3     FROM (SELECT '&tableName' as fieldName From DUAL)
  4     CONNECT BY LEVEL <= REGEXP_COUNT(fieldName ,'[,]')+1 )
  5  select * From tablename;
Enter value for tablename: little,foot,overflow

TABLENAME
----------------------------------------------------------------------
little
foot
overflow

SQL>

Более простая / короткая версия:

SQL> select level, regexp_substr('&&fieldName','[^,]+',1,level) as tableName
  2  from dual
  3  connect by LEVEL <= REGEXP_COUNT('&&fieldName' ,'[,]') + 1;
Enter value for fieldname: emp,dept,bonus,salgrade

     LEVEL TABLENAME
---------- --------------------
         1 emp
         2 dept
         3 bonus
         4 salgrade

SQL>

Итак, что она делает?REGEXP_COUNT подсчитывает количество разделителей (в данном случае запятая) и используется в CONNECT BY, который связан с иерархическим запросом, чей псевдостолбец LEVEL (я включил его в выходные данные 2-го примера) используется в REGEXP_SUBSTRкак его 4-й параметр, вхождение .

...