¿Cómo uso regex en una consulta SQLite?

Me gustaría usar una expresión regular en sqlite, pero no sé cómo.

Mi tabla tiene una columna con cadenas como esta: “3,12,13,14,19,28,32” Ahora, si escribo “where x LIKE ‘3’”, también obtengo las filas que contienen valores como 13 o 32 , pero me gustaría obtener solo las filas que tienen exactamente el valor 3 en esa cadena.

Alguien sabe cómo resolver esto?

SQLite3 admite el operador REGEXP:

WHERE x REGEXP  

Como ya señalaron otros, REGEXP llama a una función definida por el usuario que primero debe definirse y cargarse en la base de datos. Tal vez algunas distribuciones sqlite o herramientas GUI lo incluyan de manera predeterminada, pero mi instalación de Ubuntu no lo hizo. La solución fue

 sudo apt-get install sqlite3-pcre 

que implementa expresiones regulares de Perl en un módulo cargable en /usr/lib/sqlite3/pcre.so

Para poder usarlo, debe cargarlo cada vez que abra la base de datos:

 .load /usr/lib/sqlite3/pcre.so 

O podrías poner esa línea en tu ~/.sqliterc .

Ahora puedes consultar de esta manera:

 SELECT fld FROM tbl WHERE fld REGEXP '\b3\b'; 

Si estás en Windows, creo que un archivo .dll similar debería estar disponible en alguna parte.

Una forma ingeniosa de resolverlo sin expresiones regulares es where ',' || x || ',' like '%,3,%' where ',' || x || ',' like '%,3,%'

SQLite no contiene la funcionalidad de expresión regular de forma predeterminada.

Define un operador REGEXP , pero esto fallará con un mensaje de error a menos que usted o su marco definan una función de usuario llamada regexp() . Cómo lo hará dependerá de su plataforma.

Si tiene definida una función regexp() , puede hacer coincidir un número entero arbitrario de una lista separada por comas de la siguiente manera:

 ... WHERE your_column REGEXP "\b" || your_integer || "\b"; 

Pero, en realidad, parece que sería mucho más fácil si normalizara la estructura de su base de datos reemplazando esos grupos dentro de una sola columna con una fila separada para cada número en la lista separada por comas. Entonces, no solo podría usar el operador = lugar de una expresión regular, sino también usar herramientas relacionales más potentes, como las combinaciones que SQL proporciona para usted.

Una UDF SQLite en PHP / PDO para la palabra clave REGEXP que imita el comportamiento en MySQL:

 $pdo->sqliteCreateFunction('regexp', function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS') { if (isset($pattern, $data) === true) { return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0); } return null; } ); 

El modificador u no está implementado en MySQL, pero me parece útil tenerlo de forma predeterminada. Ejemplos:

 SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*'; SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's'); 

Si $data o $pattern son NULL, el resultado es NULL, como en MySQL.

No lo hago, es bueno responder una pregunta que se publicó hace casi un año. Pero estoy escribiendo esto para aquellos que piensan que Sqlite proporciona la función REGEXP .

Un requisito básico para invocar la función REGEXP en sqlite es
“Debería crear su propia función en la aplicación y luego proporcionar el enlace de callback al controlador sqlite” .
Para eso tienes que usar sqlite_create_function (interfaz C). Puede encontrar el detalle aquí y aquí

 UPDATE TableName SET YourField = '' WHERE YourField REGEXP 'YOUR REGEX' 

Y:

 SELECT * from TableName WHERE YourField REGEXP 'YOUR REGEX' 

Puede usar una expresión regular con REGEXP , pero esa es una manera tonta de hacer una coincidencia exacta.

Deberías decir WHERE x = '3' .

Considera usar esto

 WHERE x REGEXP '(^|,)(3)(,|$)' 

Esto coincidirá exactamente con 3 cuando x está en:

  • 3
  • 3,12,13
  • 12,13,3
  • 12,3,13

Otros ejemplos:

 WHERE x REGEXP '(^|,)(3|13)(,|$)' 

Esto coincidirá en 3 o 13

mi solución en python con sqlite3:

  import sqlite3 import re def match(expr, item): return re.match(expr, item) is not None conn = sqlite3.connect(':memory:') conn.create_function("MATCHES", 2, match) cursor = conn.cursor() cursor.execute("SELECT MATCHES('^b', 'busy');") print cursor.fetchone()[0] cursor.close() conn.close() 

si la expresión regular coincide, la salida sería 1, de lo contrario 0.

Si está utilizando php, puede agregar cualquier función a su statement SQL usando: SQLite3 :: createFunction . En PDO puede usar PDO :: sqliteCreateFunction e implementar la función preg_match dentro de su statement:

Vea cómo ha sido hecho por Havalite ( RegExp en SqLite usando Php )

Una cláusula whereed exhaustiva or’ed puede hacerlo sin concatenación de cadenas:

 WHERE ( x == '3' OR x LIKE '%,3' OR x LIKE '3,%' OR x LIKE '%,3,%'); 

Incluye la coincidencia exacta de cuatro casos, el final de la lista, el comienzo de la lista y la lista intermedia.

Esto es más detallado, no requiere la extensión de expresiones regulares.