Oracle: подключение по уровню и regexp_substr

Привет, у меня есть запрос 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.

Буду признателен за любую помощь. Я пробовал гуглить, но ничего не нашел.


person Amy    schedule 21.12.2018    source источник


Ответы (2)


Он разбивает строку значений, разделенных запятыми, на строки. Например (немного изменено, чтобы работало в 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-го параметра, возникновение.

person Littlefoot    schedule 21.12.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

Дополнительную информацию см. в этом сообщении

person Gary_W    schedule 21.12.2018