7
votes

Créer une instruction SQL 'comme' qui recherche des modèles spécifiques de chiffres et de lettres

est-il possible d'utiliser comme dans une requête SQL pour rechercher des modèles de nombres et de lettres. J'ai besoin de localiser tous les enregistrements dans lesquels les données de champ spécifiques ont le motif (2 numéros, 1 trait d'union, 3 lettres) ## - AAA J'utilise SSMS avec SQL Server 2008. Toute aide serait appréciée. Merci.


1 commentaires

Je pense que vous aurez besoin d'expressions régulières pour cela. Oracle a une fonction regexp_ike comme utiliser comme , mais avec une expression régulière. Malheureusement, je ne pense pas que MS SQL Server a une fonction similaire, je pense donc que vous devrez peut-être écrire une procédure pour vous aider.


5 Réponses :


2
votes

Je recommanderais de créer un assemblage CLR avec .NET. De cette façon, vous pouvez créer une fonction ou un SP qui peut utiliser regex.

http://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-fonctions-for-sql-server-by-example/

edit : Même si cela peut être fait par comme indiqué dans d'autres réponses, je recommanderais toujours de créer l'Assemblée. Si vos données changent pour une raison quelconque et que vous avez besoin d'une manière avancée de rechercher des données, cet ensemble de regex pourrait accueillir le changement


2 commentaires

L'utilisation de CLR REGEXES est à peu près surnombre pour cela. En outre, en utilisant un comme si possible sera généralement beaucoup plus rapide, car il est originaire de SQL Server et il peut utiliser mieux les index (si vous pouvez empêcher un «%» initial ou «_»).


Intéressant. Je vais examiner cela pour une utilisation future. Merci



14
votes

Je pense que comme '% [0-9] [0-9] - [A-Z] [A-Z] [A-Z]%' code> devrait fonctionner.

Je ne suis pas sûr de vos besoins de sensibilité de cas, mais vous pouvez coller une assemblée comme ci-dessous. p>

select * from
(
SELECT 'GHSASKJK' AS T UNION ALL
SELECT 'HGGH11-ABC'  UNION ALL
SELECT 'HGGH11-abc' 
) f
WHERE T LIKE '%[0-9][0-9]-[A-Z][A-Z][A-Z]%' COLLATE Latin1_General_CS_AS


1 commentaires

Parfait. Il n'y a aucune sensibilité au cas pour cette situation, mais j'apprécie les informations pour une utilisation future. Merci.



4
votes

Si les données sont exactement "## - AAA", vous pouvez simplement utiliser comme '[0-9] [0-9] - [A-Z] [A-Z] [A-Z]' . Si les données contiennent cette séquence quelque part, utilisez comme '% [0-9] [0-9] - [A-Z] [A-Z] [A-Z] [A-Z]%' . .

Notez que si votre colonne est indexée, comme '[0-9] [0-9] - [AZ] [AZ] [AZ] [AZ]' peut être Beaucoup plus rapides que n'importe quel UFD ou CLR Regex, car SQL Server comprend mieux mieux, et il peut plus facilement ignorer les parties de l'index s'il ne correspondrait jamais. Par exemple, tous les enregistrements commençant par un caractère à l'extérieur de 0-9 seront ignorés immédiatement, alors qu'un REGEX UDF ou CLR sera toujours lu ces valeurs.


0 commentaires

7
votes

Vous devriez également être capable d'accomplir cela avec Patindex . < Pré> xxx


3 commentaires

Pourquoi patindex et non comme ? Utiliser comme est beaucoup plus lisible, IMHO.


@Ruben - C'est une solution alternative et non CLR au même problème.


Je n'ai pas vu Patindex avant. Merci d'avoir développé mes connaissances



2
votes

Vous devriez pouvoir utiliser une recherche similaire à cela. Votre clause d'où serait similaire à: xxx

*** Cela suppose une caisse assume une assiette insensible


0 commentaires