Question

Je dois filtrer les données indésirables dans la table SQL (SQL Server 2008). Je dois identifier ces enregistrements et les extraire.

  • Char [0] = A..Z, a..z
  • Char [1] = 0..9
  • Char [2] = 0..9
  • Char [3] = 0..9
  • Char [4] = 0..9

{Pas de blancs autorisés}

En gros, un enregistrement vierge ressemblera à ceci:

  • T1234, U2468, K123, P50054 (4 exemples d’enregistrement)

Les données indésirables ressemblent à ceci:

  • T12 .., .T12, MARK, TP1, SP2, BFGL, BFPL (7 exemples d'enregistrement)

Quelqu'un peut-il s'il vous plaît aider avec une requête SQL pour faire une méthode LEFT et RIGHT et extraire ces caractères, et faire un LIKE IN ou quelque chose?

Une fonction serait géniale quand même!

Était-ce utile?

La solution

Ce qui suit devrait fonctionner dans quelques systèmes différents:

SELECT * 
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'

Cette approche correspondra bien à P2343, P23423JUNK et à d'autres textes similaires, mais nécessite que le format soit A0000 *.

Maintenant, si le PO implique qu'un format de 1ère position est un caractère et que toutes les positions suivantes sont numériques, comme dans A0 +, utilisez ce qui suit (dans SQL Server et plusieurs autres systèmes de base de données):

SELECT *
FROM TheTable
WHERE SUBSTRING(Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(Data, 2, LEN(Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(Data) >= 5

Pour incorporer cela dans une fonction SQL Server 2008, puisque cela semble être ce que vous aimeriez le plus, vous pouvez écrire:

CREATE FUNCTION ufn_IsProperFormat(@data VARCHAR(50))
RETURNS BIT
AS
BEGIN
    RETURN 
     CASE 
      WHEN SUBSTRING(@Data, 1, 1) LIKE '[A-Za-z]'
        AND SUBSTRING(@Data, 2, LEN(@Data) - 1) NOT LIKE '%[^0-9]%'
        AND LEN(@Data) >= 5 THEN 1 
       ELSE 0 
      END
END

... et appelez comme ça:

SELECT * 
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1

... cette requête doit changer pour les requêtes Oracle car Oracle ne semble pas prendre en charge la notation entre crochets dans les clauses LIKE:

SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}

C’est l’extension que fait gbn dans sa réponse, mais ces versions autorisent des longueurs de chaîne variables sans les conditions OU.

MODIFIER : mise à jour pour prendre en charge les exemples dans SQL Server et Oracle afin de garantir le format A0 +, de sorte que A1324, A2342388 et P2342 ne correspondent pas, contrairement à A2342JUNK et A234.

Le code Oracle REGEXP_LIKE a été emprunté au message de Mark, mais mis à jour pour prendre en charge 4 chiffres ou plus.

Ajout d'une approche personnalisée SQL Server 2008 qui implémente ces techniques.

)

C’est l’extension que fait gbn dans sa réponse, mais ces versions autorisent des longueurs de chaîne variables sans les conditions OU.

MODIFIER : mise à jour pour prendre en charge les exemples dans SQL Server et Oracle afin de garantir le format A0 +, de sorte que A1324, A2342388 et P2342 ne correspondent pas, contrairement à A2342JUNK et A234.

Le code Oracle REGEXP_LIKE a été emprunté au message de Mark, mais mis à jour pour prendre en charge 4 chiffres ou plus.

Ajout d'une approche personnalisée SQL Server 2008 qui implémente ces techniques.

Autres conseils

Dépend de votre base de données. Beaucoup ont des fonctions regex (les exemples de notes n’ayant pas été testés, vérifiez)

par exemple. Oracle

SELECT x
 FROM table
 WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}

Sybase utilise LIKE

)

Sybase utilise LIKE

Étant donné que vous permettez entre 3 et 6 chiffres pour le numéro dans vos exemples, il est probablement préférable d'utiliser la fonction ISNUMERIC () à partir du deuxième caractère:

SELECT *
FROM TheTable
-- start with a letter
WHERE Data LIKE '[A-Za-z]%'
    -- everything from 2nd character onwards is a number
    AND ISNUMERIC( SUBSTRING( Data, 2, 50 ) ) = 1
    -- number doesn't have a decimal place
    AND Data NOT LIKE '%.%'

Pour plus d'informations, consultez la fonction ISNUMERIC sur MSDN.

Notez également que:

  • J'ai limité la deuxième partie à 50 caractères maximum. Modifiez-la selon vos besoins.
  • À proprement parler, vous devriez vérifier les symboles de devise, etc., comme le permet ISNUMERIC, ainsi que les +/- et quelques autres

Une meilleure option pourrait être de créer une fonction qui vérifie que chaque caractère après le premier est compris entre 0 et 9 (ou 1 et 0 si vous utilisez des codes ASCII).

Vous ne pouvez pas utiliser d’expressions régulières dans SQL Server, vous devez donc utiliser OR. Corriger la réponse de David Andres ...

WHERE
    (
    Data LIKE '[A-Za-z][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9][0-9]'
    )

La réponse de David autorise "D1234junk". à travers

Vous n’avez besoin que de "[A-Z] " si vous n'avez pas la sensibilité à la casse

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top