J'aimerais utiliser une expression régulière dans sqlite, mais je ne sais pas comment.
Ma table a une colonne avec des chaînes comme celle-ci: "3,12,13,14,19,28,32" Maintenant, si je tape "où x LIKE '3'" J'obtiens également les lignes qui contiennent des valeurs comme 13 ou 32 , mais j'aimerais obtenir uniquement les lignes qui ont exactement la valeur 3 dans cette chaîne.
Quelqu'un sait-il comment résoudre ceci?
regex
sqlite
query-string
cody
la source
la source
Réponses:
SQLite3 prend en charge l'opérateur REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
la source
regex()
fonction pour soutenir l'REGEXP
opérateur? Par défaut, aucune fonction utilisateur n'a été ajoutée.Comme d'autres l'ont déjà souligné, REGEXP appelle une fonction définie par l'utilisateur qui doit d'abord être définie et chargée dans la base de données. Peut-être que certaines distributions de sqlite ou outils d'interface graphique l'incluent par défaut, mais pas mon installation Ubuntu. La solution était
qui implémente des expressions régulières Perl dans un module chargeable dans
/usr/lib/sqlite3/pcre.so
Pour pouvoir l'utiliser, vous devez le charger à chaque fois que vous ouvrez la base de données:
Ou vous pouvez mettre cette ligne dans votre
~/.sqliterc
.Vous pouvez maintenant interroger comme ceci:
Si vous souhaitez interroger directement à partir de la ligne de commande, vous pouvez utiliser le
-cmd
commutateur pour charger la bibliothèque avant votre SQL:Si vous êtes sous Windows, je suppose qu'un fichier .dll similaire devrait être disponible quelque part.
la source
Une façon hacky de le résoudre sans regex est
where ',' || x || ',' like '%,3,%'
la source
',' || x || ','
SQLite ne contient pas de fonctionnalité d'expression régulière par défaut.
Il définit un
REGEXP
opérateur, mais cela échouera avec un message d'erreur à moins que vous ou votre infrastructure définissez une fonction utilisateur appeléeregexp()
. La façon dont vous procédez dépendra de votre plate-forme.Si vous avez
regexp()
défini une fonction, vous pouvez faire correspondre un entier arbitraire dans une liste séparée par des virgules comme ceci:Mais en réalité, il semble que vous trouveriez les choses beaucoup plus faciles si vous normalisiez la structure de votre base de données en remplaçant ces groupes dans une seule colonne par une ligne séparée pour chaque nombre dans la liste séparée par des virgules. Ensuite, vous pouvez non seulement utiliser l'
=
opérateur au lieu d'une expression régulière, mais également utiliser des outils relationnels plus puissants tels que les jointures que SQL fournit pour vous.la source
Un UDF SQLite en PHP / PDO pour le
REGEXP
mot-clé qui imite le comportement dans MySQL:Le
u
modificateur n'est pas implémenté dans MySQL, mais je trouve utile de l'avoir par défaut. Exemples:Si l'un
$data
ou l' autre$pattern
est NULL, le résultat est NULL - comme dans MySQL.la source
ma solution en python avec sqlite3:
si regex correspond, la sortie serait 1, sinon 0.
la source
Je ne sais pas, il est bon de répondre à une question qui a été postée il y a presque un an. Mais j'écris ceci pour ceux qui pensent que Sqlite lui-même fournit la fonction REGEXP .
Une exigence de base pour appeler la fonction REGEXP dans sqlite est
"Vous devez créer votre propre fonction dans l'application et ensuite fournir le lien de rappel vers le pilote sqlite" .
Pour cela, vous devez utiliser sqlite_create_function (interface C). Vous pouvez trouver le détail ici et ici
la source
Et :
la source
Une clause or'ed where exhaustive peut le faire sans concaténation de chaînes:
Comprend la correspondance exacte des quatre cas, la fin de la liste, le début de la liste et la mi-liste.
Ceci est plus détaillé, ne nécessite pas l'extension regex.
la source
Avec python, en supposant
con
la connexion à SQLite, vous pouvez définir l'UDF requise en écrivant:Voici un exemple plus complet:
la source
if x not Null and y not Null and re.search(x,y)
sinon il jettera.Vous pouvez utiliser une expression régulière avec REGEXP , mais c'est une façon idiote de faire une correspondance exacte.
Tu devrais juste dire
WHERE x = '3'
.la source
Pensez à utiliser ceci
Cela correspondra exactement à 3 lorsque x est dans:
Autres exemples:
Cela correspondra le 3 ou le 13
la source
Dans le cas où quelqu'un cherche une condition non-regex pour Android Sqlite , comme cette chaîne,
[1,2,3,4,5]
n'oubliez pas d'ajouter le crochet ( [] ) même pour les autres caractères spéciaux comme la parenthèse ( {} ) dans la condition @phyattla source
Si vous utilisez php, vous pouvez ajouter n'importe quelle fonction à votre instruction sql en utilisant: SQLite3 :: createFunction . Dans PDO, vous pouvez utiliser PDO :: sqliteCreateFunction et implémenter la fonction preg_match dans votre instruction:
Voyez comment c'est fait par Havalite ( RegExp dans SqLite en utilisant Php )
la source
Vous pouvez également envisager
Cela permettra de trouver le numéro 3 dans n'importe quelle chaîne à n'importe quelle position
la source
Dans Julia, le modèle à suivre peut être illustré comme suit:
la source
pour rails
la source