2016-10-31 1 views
1

Spalte [Plate_No] in [my_Table] enthält Fahrzeugkennzeichen für griechische und ausländische Fahrzeuge. Im Allgemeinen enthalten griechische Plattennummern nur griechische Zeichen, und ausländische Platten enthalten nur lateinische Zeichen.sql: Zeichenfolge mit mehreren Sprachen erkennen

Nun enthalten einige Zeilen Plattennummern mit gemischten Zeichen und sind falsch.

zum Beispiel:

DECLARE @my_Plates AS TABLE (
    Plate_No NVARCHAR(50) 
) 

INSERT INTO @my_Plates (
    Plate_No 
) 
SELECT 'AAA1234' 
UNION ALL 
SELECT 'ΑΑΑ1234' 
UNION ALL 
SELECT 'AΑA1234' 

SELECT Plate_No, LOWER(Plate_No) AS LC_Plate_No 
FROM @my_Plates 

Ergebnis:

Plate_No | LC_Plate_No 
--------------------- 
AAA1234 | aaa1234  <-- correct 
ΑΑΑ1234 | ααα1234  <-- correct 
AΑA1234 | aαa1234  <-- incorrect 

Wie Sie Plattennummern sehen visuell gleich sind, aber wenn NIEDER angewendet, ist der Unterschied offensichtlich.

Wie können diese fehlerhaften Zeilen erkannt werden?

Jede Hilfe wäre willkommen.

+0

Ich bearbeitet Ihre Beispieldaten einfügen Anweisung, damit es die Ausgabe in der Ergebnis-Abschnitt produzieren - das Original hat nicht für mich arbeiten. –

+0

seltsame Sache. kopieren und einfügen von stackoverflow zu meinem SSMS funktioniert gut. – armen

Antwort

2

Hier ist eine Methode, die funktioniert, wenn die Spaltensortierung Greek_CI_AS ist:

DECLARE @my_Plates AS TABLE (
    Plate_No NVARCHAR(50) COLLATE Greek_CI_AS 
) 

INSERT INTO @my_Plates (
    Plate_No 
) 
SELECT UPPER(N'aaa1234') 
UNION ALL 
SELECT UPPER(N'ααα1234') 
UNION ALL 
SELECT UPPER(N'aαa1234') 

SELECT Plate_No, LOWER(Plate_No) 
FROM @my_Plates 
WHERE Plate_No <> CAST(Plate_No AS varchar(50)) COLLATE Latin1_General_CI_AS 
AND  Plate_No LIKE '%[A-Z]%' 

dies wird wahrscheinlich nicht eine gute Leistung auf großen Datenmengen - weder der WHERE Bedingungen einen Index für Plate_No nutzen können.

+0

Dies gibt keine Zeile aus meinem Beispiel zurück. – armen

+0

@armen - sowohl dies als auch die Unterschiede, die wir beim Kopieren/Einfügen aus dem Beispielcode in der Frage erfahren haben, deuten darauf hin, dass die Sortiereinstellungen unserer Umgebungen möglicherweise einen Unterschied aufweisen. Was gibt 'exec sp_helpsort' für Sie zurück? –

+0

Griechisch, Groß-/Kleinschreibung, Akzent-sensitiv, Kanatype-unempfindlich, Breiten-unempfindlich – armen

0

Hier ist ein Workaround mit LIKE. Es ist schwer für 10.000.000+ Zeilen, aber es ist OK, da es nur eine einmalige Überprüfung auf Korrektur ist.

SELECT 
Plate_No 
, LOWER(Plate_No) AS LC_Plate_No 
, (
    CASE WHEN Plate_No LIKE '%[α-ω]%' AND Plate_No LIKE '%[a-z]%' 
     THEN '0' 
     ELSE '1' 
    END 
) AS isCorrect 
FROM @my_Plates 
Verwandte Themen