Эмулировать REGEXP как поведение в SQL - PullRequest
0 голосов
/ 17 января 2011

Я разместил этот вопрос на новом dba.stackexchange.com (пожалуйста, дайте мне знать, если мне нужно удалить его).

Я работаю над DB2базы данных, и, насколько я вижу, регулярное выражение не поддерживается (без дополнительных библиотек).

Поэтому я не могу реализовать нечто подобное тому, что объясняется в этой статье " Приведение силы сопоставления регулярных выражений вSQL"

Знаете ли вы, если я могу" эмулировать "с помощью оператора SQL регулярное выражение, подобное этому?

^[aofdmep]\{1\}[a-z]\{1\}[a-z0-9]\{4\}a[sidbfkfpo]\{1\}

РЕДАКТИРОВАТЬ 2

https://dba.stackexchange.com/questions/651/emulate-regexp-like-behaviour-in-sql/664#664 это ответ, который я получил.

SELECT * FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) ГДЕ substr (MyString, 1,1) = 'a' AND
substr (MyString, 2,1) IN ('a', 'o', 'f', 'd', 'm', 'e', ​​'p') AND
substr (MyString, 3,1) МЕЖДУ «a» И «z» AND (substr (MyString, 4,1) МЕЖДУ «a» И «z» ИЛИ substr (MyString, 4,1) МЕЖДУ «0» И'9') AND (substr (MyString, 5,1) МЕЖДУ 'a' AND 'z' ИЛИ ​​substr (MyString, 5,1) МЕЖДУ '0'И' 9 ') И (substr (MyString, 6,1) МЕЖДУ' a 'И' z 'ИЛИ substr (MyString, 6,1) МЕЖДУ' 0 'И' 9 ') И (substr (MyString, 7,1) МЕЖДУ «a» И «z» ИЛИ substr (MyString, 7,1) МЕЖДУ «0» И «9») И substr (MyString, 8,1) IN ('s', 'i', 'd', 'b', 'f', 'k', 'p', 'o');

Ответы [ 5 ]

1 голос
/ 22 июня 2015

REGEXP_LIKE теперь доступен в DB2 для iSeries - смотрите: http://www.itjungle.com/fhg/fhg051915-story01.html

1 голос
/ 17 октября 2014

Относительно вашего решения EDIT 2:

SELECT *
  FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
 WHERE substr(MyString,1,1) = 'a'
   AND substr(MyString,2,1) IN ('a','o','f','d','m','e','p')
     AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
     AND (substr(MyString,4,1) BETWEEN 'a' AND 'z' OR substr(MyString,4,1) BETWEEN '0' AND '9')
     AND (substr(MyString,5,1) BETWEEN 'a' AND 'z' OR substr(MyString,5,1) BETWEEN '0' AND '9')
     AND (substr(MyString,6,1) BETWEEN 'a' AND 'z' OR substr(MyString,6,1) BETWEEN '0' AND '9')
     AND (substr(MyString,7,1) BETWEEN 'a' AND 'z' OR substr(MyString,7,1) BETWEEN '0' AND '9')
     AND substr(MyString,8,1) IN ('s','i','d','b','f','k','p','o')
;

Вы можете рассмотреть возможность использования оператора LIKE, если у вас длинный список символов или если у вас несколько диапазонов. Это может сократить и упростить код:

SELECT *
  FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
 WHERE substr(MyString,1,1) = 'a'
   AND 'aofdmep' like '%'||substr(MyString,2,1)||'%'
   AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
   AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,4,1)||'%'
   AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,5,1)||'%'
   AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,6,1)||'%'
   AND 'abcdefghijklmnopqrstuvwxyz0123456789' like '%'||substr(MyString,7,1)||'%'
   AND 'sidbfkpo' like '%'||substr(MyString,8,1)||'%'
;

Для повторяющихся списков символов вы можете использовать константу столбца CROSS JOINed:

SELECT *
  FROM (SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1) T
  CROSS JOIN (SELECT 'abcdefghijklmnopqrstuvwxyz0123456789' alphanum FROM SYSIBM.SYSDUMMY1) T2
 WHERE substr(MyString,1,1) = 'a'
   AND 'aofdmep' like '%'||substr(MyString,2,1)||'%'
   AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
   AND alphanum like '%'||substr(MyString,4,1)||'%'
   AND alphanum like '%'||substr(MyString,5,1)||'%'
   AND alphanum like '%'||substr(MyString,6,1)||'%'
   AND alphanum like '%'||substr(MyString,7,1)||'%'
   AND 'sidbfkpo' like '%'||substr(MyString,8,1)||'%'
;

Не требуется для вашего примера, но таблица CROSS JOINed может определять несколько столбцов именованных классов символов.

1 голос
/ 17 января 2011

Вы можете сделать это, используя SUBSTR , но я бы порекомендовал написать хранимую процедуру Java для этого. Это довольно просто собрать вместе, используя бесплатный инструмент IBM Data Studio .

1 голос
/ 28 апреля 2014

Вы можете использовать регулярные выражения в DB2 через xQuery:

db2 "with val as (
 select t.text
 from texts t
 where xmlcast(xmlquery('fn:matches(\$TEXT,''^[A-Za-z 0-9]*$'')') as integer) = 0
)
select * from val"

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.xml.doc/doc/xqrfnmat.html

0 голосов
/ 17 января 2011

Что ж, в статье, на которую вы ссылались, конкретно рассматривается ваш вопрос - передача возможностей RegEx в DB2. DB2 - это продукт IBM, нет? Если IBM говорит, что вам нужно использовать библиотеку надстроек, скорее всего, вам нужно использовать библиотеку надстроек.

Стандартный ANSI SQL, на который вы можете рассчитывать наверняка (и даже не на 100%) из базы данных, не поддерживает ничего удаленно RegEx.

Oracle предоставляет внешние библиотеки для использования в запросах RegEx. Sql Server не позволяет, но позволяет вам создавать ссылки в ваших собственных библиотеках .NET. Если мфг. вашего БД предоставляет информацию и ссылки о том, как использовать определенную внешнюю библиотеку, и это, вероятно, ваш лучший выбор.

При использовании стандартного оператора SQL единственное сопоставление, которое вы можете сделать, - это простое сопоставление с подстановочными знаками.

В любом случае было бы полезно узнать о расширяемости, поскольку, когда вы знаете, как это сделать, вы можете дико расширять функциональность своей базы данных, чтобы выполнять практически любые запросы, которые вам могут потребоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...