Используйте REGEXP_SUBSTR в DB2

Я хочу использовать что-то вроде REGEXP_SUBSTR в DB2 (версия 10.5).

Вот пример того, что я пробовал:

SELECT REGEXP_SUBSTR('hello to you', '.o') 
FROM sysibm.sysdummy1

Я получил эту ошибку: [Код ошибки: -420, состояние SQL: 22018]

09:23:12  [SELECT - 0 row(s), 0.000 secs]  [Error Code: -420, SQL State: 22018]  DB2 SQL Error: SQLCODE=-420, SQLSTATE=22018, SQLERRMC=INTEGER, DRIVER=3.57.82
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

person Goldray    schedule 16.09.2015    source источник
comment
Вы хотите использовать любое регулярное выражение или просто искать фрагменты строк? В DB2 нет regex_substr. Ваши варианты зависят от того, что вы хотите сделать.   -  person data_henrik    schedule 16.09.2015
comment
1- Я хочу проверить, содержит ли столбец регулярное выражение, а затем извлечь его для использования другим столбцом. Например, обновите table_name set column_name = REGEXP_SUBSTR (column2_name, '^[A-Za-z0-9]*$'), где условие;   -  person Goldray    schedule 16.09.2015
comment
Посмотрите на этот вопрос Stackoverflow о том, как его эмулировать stackoverflow.com /вопросы/4763757/   -  person data_henrik    schedule 16.09.2015
comment
REGEXP_SUBSTR не существует в DB2! Регулярные выражения можно использовать с помощью xquery (я уже ответил на этот вопрос). Что вы можете сделать, так это обернуть xquery в UDF, чтобы иметь указанную вами функцию. Кроме того, вы можете установить набор хранимых процедур, предоставляющих регулярные выражения (посмотрите в DeveloperWorks).   -  person AngocA    schedule 16.09.2015


Ответы (2)


В DB2 нет функции, эквивалентной REGEXP_SUBSTR.

Однако вы можете добиться аналогичных результатов с помощью функции XMLQUERY.

SELECT 
  XMLCAST(
   XMLQUERY('fn:replace($src,"^hello | you$","")' 
   PASSING 'hello to you' AS "src")
  AS VARCHAR(255))
FROM SYSIBM.SYSDUMMY1;

Сложность Здесь fn:replace удаляет совпадающие шаблоны, поскольку реализация DB2 не поддерживает шаблоны подгрупп () и $1

person Stavr00    schedule 16.09.2015

С DB2 V11.1 теперь есть REGEXP_SUBSTR(). Он работает просто как это:

Пример 1

SELECT REGEXP_SUBSTR('hello to you', '.o',1,1) 
   FROM sysibm.sysdummy1Copy

Возвращает строку, которая соответствует любому символу, предшествующему «о».

Результат "ло".

Пример 2

SELECT REGEXP_SUBSTR('hello to you', '.o',1,2) 
   FROM sysibm.sysdummy1Copy

Возвращает второе вхождение строки, которое соответствует любому символу, предшествующему 'o'.

Результат "к".

Пример 3

SELECT REGEXP_SUBSTR('hello to you', '.o',1,3) 
   FROM sysibm.sysdummy1

Возвращает третье вхождение строки, которое соответствует любому символу, предшествующему 'o'.

Результат «йо».

person SovietFrontier    schedule 17.05.2019