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 "donde 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?
regex
sqlite
query-string
cody
fuente
fuente
Respuestas:
SQLite3 admite el operador REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
fuente
regex()
función para apoyar alREGEXP
operador? Por defecto, no se ha agregado una función de usuario.Como ya han señalado 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 forma predeterminada, pero mi instalación de Ubuntu no lo hizo. La solucion fue
que implementa expresiones regulares de Perl en un módulo cargable en
/usr/lib/sqlite3/pcre.so
Para poder usarlo, debes cargarlo cada vez que abras la base de datos:
O podrías poner esa línea en tu
~/.sqliterc
.Ahora puedes realizar consultas como esta:
Si desea realizar consultas directamente desde la línea de comandos, puede usar el
-cmd
conmutador para cargar la biblioteca antes de su SQL:Si está en Windows, supongo que un archivo .dll similar debería estar disponible en alguna parte.
fuente
Una forma hacky de resolverlo sin regex es
where ',' || x || ',' like '%,3,%'
fuente
',' || x || ','
SQLite no contiene la funcionalidad de expresión regular de forma predeterminada.
Define un
REGEXP
operador, pero esto fallará con un mensaje de error a menos que usted o su marco definan una función de usuario llamadaregexp()
. La forma de hacerlo dependerá de su plataforma.Si tiene una
regexp()
función definida, puede hacer coincidir un entero arbitrario de una lista separada por comas así:Pero realmente, parece que las cosas le resultarían mucho más fáciles 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 en lugar de una expresión regular, sino también usar herramientas relacionales más poderosas como las uniones que SQL le proporciona.fuente
Una UDF de SQLite en PHP / PDO para la
REGEXP
palabra clave que imita el comportamiento en MySQL:El
u
modificador no está implementado en MySQL, pero me resulta útil tenerlo por defecto. Ejemplos:Si
$data
o$pattern
es NULL, el resultado es NULL, como en MySQL.fuente
mi solución en python con sqlite3:
si la expresión regular coincide, la salida sería 1, de lo contrario 0.
fuente
No sé, es bueno responder una pregunta que se publicó hace casi un año. Pero estoy escribiendo esto para aquellos que piensan que Sqlite en sí mismo proporciona la función REGEXP .
Un requisito básico para invocar la función REGEXP en sqlite es
"Debe crear su propia función en la aplicación y luego proporcionar el enlace de devolución de llamada al controlador sqlite" .
Para eso, debe usar sqlite_create_function (interfaz C). Puedes encontrar el detalle aquí y aquí
fuente
Y:
fuente
Una cláusula where exhaustiva de or'ed puede hacerlo sin la concatenación de cadenas:
Incluye los cuatro casos de coincidencia exacta, final de lista, comienzo de lista y lista intermedia.
Esto es más detallado, no requiere la extensión regex.
fuente
Con Python, asumiendo que
con
es la conexión a SQLite, puede definir la UDF requerida escribiendo:Aquí tienes un ejemplo más completo:
fuente
if x not Null and y not Null and re.search(x,y)
contrario arrojará.Podría usar una expresión regular con REGEXP , pero esa es una forma tonta de hacer una coincidencia exacta.
Deberías decir
WHERE x = '3'
.fuente
Considere usar esto
Esto coincidirá exactamente con 3 cuando x esté en:
Otros ejemplos:
Esto coincidirá en 3 o 13
fuente
En caso de que si alguien busca una condición no regular para Android Sqlite , como esta cadena
[1,2,3,4,5]
, no olvide agregar el corchete ( [] ) para otros caracteres especiales como paréntesis ( {} ) en la condición @phyattfuente
Si está usando php, puede agregar cualquier función a su declaración sql usando: SQLite3 :: createFunction . En PDO puede usar PDO :: sqliteCreateFunction e implementar preg_match función dentro de su declaración:
Vea cómo lo hace Havalite ( RegExp en SqLite usando Php )
fuente
También puede considerar
Esto permitirá encontrar el número 3 en cualquier cadena en cualquier posición.
fuente
En Julia, el modelo a seguir se puede ilustrar de la siguiente manera:
fuente
para rieles
fuente