similar regulares regular query postgres ilike expresiones examples ejemplo con sql regex db2

regulares - regular expression sql server 2012



Emular comportamiento similar a REGEXP en SQL (5)

Bueno, el artículo al que hizo referencia está abordando específicamente su pregunta: llevar la energía de RegEx a DB2. DB2 es el producto de IBM, ¿no? Si IBM dice que necesita usar una biblioteca de complementos, entonces es probable que necesite usar una biblioteca de complementos.

Estándar ANSI SQL, que es todo lo que puede contar con certeza (e incluso que no el 100%) de una base de datos, no admite nada remotamente RegEx.

Oracle proporciona bibliotecas externas para usar en consultas RegEx. El servidor Sql no lo hace, pero le permite vincularlo en sus propias bibliotecas .NET. Si el mfg. de su DB está proporcionando información y enlaces sobre cómo usar una biblioteca externa específica, esa es probablemente su mejor apuesta.

Con una declaración SQL estándar, la única coincidencia que puede hacer es la coincidencia simple de comodines.

Obtener un control sobre la extensibilidad sería lo mejor para usted, ya que una vez que sepa cómo hacerlo, puede ampliar enormemente la funcionalidad de su base de datos para hacer casi cualquier tipo de consulta que pueda desear.

He publicado esta pregunta en el nuevo dba.stackexchange.com (por favor, avíseme si tengo que eliminar uno).

Estoy trabajando en una base de datos DB2, y hasta donde puedo ver, no es compatible con regexp (sin bibliotecas adicionales).

Así que no puedo implementar algo similar a lo que se explica en este artículo " Llevar el poder de la expresión regular que se corresponde con SQL "

¿Sabes si puedo "emular", con una instrucción SQL, una expresión regular como esta?

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

EDIT 2

https://dba.stackexchange.com/questions/651/emulate-regexp-like-behaviour-in-sql/664#664 esta es la respuesta que tengo.

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


Usted podría lograr esto usando SUBSTR , pero recomendaría escribir un procedimiento almacenado de Java para esto. Es bastante simple juntar uno utilizando la herramienta gratuita IBM Data Studio .



En cuanto a su solución 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'') ;

Puede considerar usar el operador LIKE cuando tenga una larga lista de caracteres, o si tiene múltiples rangos. Puede acortar y simplificar el código:

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)||''%'' ;

Para las listas de caracteres repetidos, puede utilizar una constante de columna 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)||''%'' ;

No es necesario para su ejemplo, pero la "tabla" CROSS JOINed podría definir múltiples columnas de clases de caracteres nombrados.