Parsing Chars in SQL mit PATINDEX

Ich versuche, einen String mit rohem sql zu validieren; versucht mit:

DECLARE @AlphaNumeric varchar(50) SET @AlphaNumeric = '1017a' SELECT SUBSTRING(@AlphaNumeric, 1, (PATINDEX('%[^0-9]%', @AlphaNumeric) - 1)) AS 'Numeric', SUBSTRING(@AlphaNumeric, PATINDEX('%[^0-9]%', @AlphaNumeric), DATALENGTH(@AlphaNumeric)) AS 'Alpha' 

Aber wenn der Benutzer 101a7a tippt, funktioniert das nicht richtig, was ich genau machen möchte, ist; Ich möchte die Variable immer sein, numerisch + alphanumerisch, Länge spielt keine Rolle. Beispielsweise :

 2303A OK 23A434A NOT OK A344 NOT OK. 

4324AAC OK

Dies wäre tot einfach, wenn ich es in Regex tun könnte, aber sql gibt mir Kopfschmerzen 🙁

   

Briefe gefolgt von Zahlen sind OK; Zahlen, gefolgt von Briefen sind nicht; Alle character müssen Buchstaben oder Zahlen sein. Daher…

 select * from yourtable where yourfield like '%[0-9][az]%' and not (yourfield like '%[az][0-9]%') and not (yourfield like '%[^0-9a-z]%') 

Ich denke, das wird tun was du willst. Zumindest funktioniert es an Ihren Beispieldaten:

 with t as ( select '2303A' as col union all select '23A434A' union all select 'A344' ) select *, (case when col like '%[0-9]%' and substring(col, patindex('%[AZ]%', col), len(col)) not like '%[^AZ]%' then 'OK' else 'NOT OK' end) from t; 

Die beiden Bedingungen sind. Überprüfen Sie zunächst, dass die characterfolge eine Nummer irgendwo hat. Dann überprüfen Sie, dass es nur Buchstaben gibt, nachdem der erste Buchstabe gefunden wurde. Ich gehe davon aus, dass alle Briefe Großbuchstaben sind.

BEARBEITEN:

Es könnte einen leichteren path geben. Sie können überprüfen, dass eine Zahl von einem Buchstaben irgendwo in der characterkette gefolgt wird, aber dass ein Buchstabe nie von einer Zahl gefolgt wird. Dazu brauchen Sie nur:

 select (case when col not like '%[^A-Z0-9]%' and col like '%[0-9][AZ]%' and col not like '%[AZ][0-9]%' then 'OK' else 'NOT OK' end) 

Ich habe einen Ansatz, der in deiner Situation arbeiten sollte. Grundsätzlich identifizieren Sie die Position der letzten Ganzzahl und vergleichen Sie sie mit der Position der ersten Nicht-Ganzzahl. Sie können die Position der letzten Integer so erhalten

 len(@AlphaNumeric) - PATINDEX('%[0-9]%', Reverse(@AlphaNumeric))+1 

und du kannst die Position der ersten Nicht-Integer so bekommen

  PATINDEX('%[^0-9]%', @AlphaNumeric) 

so würde das deine where-Klausel (wo alle ganzen Zahlen irgendwelche Nicht-Integer wie diese vorgehen

 Where (len(@AlphaNumeric) - PATINDEX('%[0-9]%', Reverse(@AlphaNumeric))+1 ) < PATINDEX('%[^0-9]%', @AlphaNumeric)