Rails SQL expression régulière
Je suis en train de rechercher le nombre maximum dans la série A0001, A0002, A1234, A2351, etc... Le problème est que la liste, je suis à la recherche a aussi dans des chaînes de caractères comme AG108939, E092357, AL399, 22-30597, etc...
Donc, fondamentalement, je veux que la Plus haute d'Un#### valeur dans ma base de données. J'ai été en utilisant la requête suivante:
@max_draw = Drawing.where("drawing_number LIKE ?", "A%")
Qui travaillait jusqu'à ce que les nombres tels que AG309 commencé à entrer dans la voie, car il commence par Un a, mais a un format différent de ce que je suis à la recherche d'.
Je suppose que ce doit être assez simple avec des expressions régulières, mais je suis nouveau à cela et ne savent pas comment bien écrire cette requête avec une expression régulière. Voici certaines choses que j'ai essayé que le juste retour de néant:
@max_draw = Drawing.where("drawing_number LIKE ?", /A\d+/)
@max_draw = Drawing.where("drawing_number LIKE ?", "/A\d+/")
@max_draw = Drawing.where("drawing_number LIKE ?", "A[0-9]%")
Vous devez vous connecter pour publier un commentaire.
Vous avez fait un bon travail! La chose manquait, c'était la
REGEXP
fonction qui est utilisée pour les regex dans les requêtes:Si dans votre cas, l'utilisation
En SQL, vous utilisez le
'-colons
, c'est bizarre parce que normalement, vous commencez regex avec/-backslashes
REGEXP
REGEXP
par défaut. stackoverflow.com/questions/5071601/...regex
, qu'avez-vous consommer?Sur Rails 4+ avec une base de données Postgres la forme générale d'une RegEx requête est:
Comme pour la regex, il peut être un général
'^A\d+$'
ou plus spécifiques'^A\d{4}$'
Le décomposant:
Fondamentalement, la regex lit "la chaîne doit commencer par un A, suivi de quatre chiffres et que la chaîne devrait prendre fin".
La dernière question est la suivante:
En savoir plus sur ruby RegEx à RubyDoc ou la plus accessible Perl variante (utilisé par la Sublime text)
~*
pour la casse regexp, et~
pour la casse. pour la négation juste ajouter un bang!
(!~
et!~*
)('\a' + variable.to_s + '\b')
. leto_s
probablement important depuis qu'elle n'est pas d'interpolation, il va probablement l'erreur si elle n'est pas suffisamment "filandreux" avec un transtypage de problème.Vous ne pouvez pas utiliser des expressions régulières dans SQL qui est ce que vous essayez de faire. Votre meilleur pari serait de sélectionner les entrées qui commencent par Un, comme votre code d'origine, puis passez les entrées qui ont plus d'une lettre au début.
Je suis raisonnablement certain qu'il est possible d'obtenir cette courte, mais cela devrait faire ce que vous avez besoin.
(\A est le début de la ligne d'ancrage qui fonctionne avec des chaînes de caractères contenant des sauts de ligne)
({2,} correspond à deux ou plus de la procédure de la gamme de caractères)
http://www.rubular.com/ est génial pour les tests ruby regexes.