2016-05-17 8 views
0

Ich versuche, Daten aus meiner Tabelle mit Regex-Muster in SQL Management Studio 2008 R2 zu filtern.MSSQL Regex Daten filtring

Meine Tabelle "Asset" enthält die Spalte "Asset_n", die die Asset-Namen enthält. Ziel ist es, in der Lage fünf Arten von Namen zu filtern, um nur:

  1. enthält nur fünf numerische Zeichen zB 12345
  2. enthält nur sechs numerische Zeichen zB 123456
  3. fünf numerische Zeichen enthält, und endet mit einem oder zwei nicht numerisch z 12345a oder 12345ab
  4. enthält sechs numerische Zeichen und endet mit einer oder zwei nicht numerischen z. 123456a oder 123456ab

Hier meine Frage ist:

SELECT * FROM Asset WHERE asset_n LIKE [\d{5,6}\w{1,2}] 

Die Abfrage Rückkehr nichts ... Ich habe das gleiche RegexMuster in Powershell verwendet und es ist perfekt funktioniert. SQL ist etwas Neues für mich, daher weiß ich nicht wirklich, wie ich mein Regex-Muster für SQL-Abfragen erstellen soll.

Vielen Dank im Voraus für Ihre Hilfe.

+0

SQL Server verfügt nicht über vollständige Regex-Funktionen. Es hat einige Muster, aber es ist ziemlich rudimentär. Für diese Stufe der Regex müssten Sie CLR verwenden. –

+0

http://Stackoverflow.com/a/31693412/1080354 – gotqn

Antwort

0

Try this:

select * from Asset 
where left(asset_n, 5) not like '%[^0-9]%' and 
     (SUBSTRING(asset_n, 6, 4) like '[0-9][a-z][a-z]' or 
     SUBSTRING(asset_n, 6, 4) like '[0-9][a-z]' or 
     SUBSTRING(asset_n, 6, 4) like '[0-9]' or 
     SUBSTRING(asset_n, 6, 4) = '') 

Warum 4? Da Sie eine maximale Länge von 8 Zeichen haben, möchten Sie diejenigen filtern, deren Länge größer ist.

+0

Vielen Dank, genau das, was ich gesucht habe! Ich habe eine Frage mehr, gibt es eine Möglichkeit, alle nicht numerischen Zeichen aus dem Ergebnis dieser Abfrage zu entfernen? Vielen Dank im Voraus – kekimian

+0

@kekimian, nein, es gibt keine solche Funktion. Sie müssen dafür einen Cursor oder eine CLR verwenden. –

1

SQL Server unterstützt nicht regex in LIKE Argument, aber könnten Sie tun, was Sie die folgende Abfrage die gewünschte Option aus:

SELECT * FROM Asset WHERE 
asset_n LIKE '[0-9][0-9][0-9][0-9][0-9]' 
OR asset_n LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]' 
OR asset_n like '[0-9][0-9][0-9][0-9][0-9][a-z]' OR asset_n like '[0-9][0-9][0-9][0-9][0-9][a-z][a-z]' 
OR asset_n like '[0-9][0-9][0-9][0-9][0-9][0-9][a-z]' OR asset_n like '[0-9][0-9][0-9][0-9][0-9][0-9][a-z][a-z]'