gelöst MSSQL regular expressions

Mitglied: ukulele-7

ukulele-7 (Level 2) - Jetzt verbinden

31.03.2019 um 23:47 Uhr, 936 Aufrufe, 6 Kommentare

Nabend

Ich habe ein bischen gebastelt und bin auf etwas für mich merkwürdiges gestoßen. Wenn ich eine Werteliste mit LIKE suche, funktioniert das. Auch funktionieren Wertebereiche aber beides kombinieren ist irgendwie sonderbar, vor allem wenn ich versuche Leerzeichen zu berücksichtigen.

funktioniert:
@Data LIKE '[AA,BB,CC]%'
@Data LIKE '[A-C][A-C]%'
@Data LIKE '[AA,BB,CC][A-C]%'

funktioniert nicht:
@Data LIKE '[AA,BB,CC][ ][A-C]%'
@Data LIKE '[AA,BB,CC] [A-C]%'
@Data LIKE '[AA ,BB ,CC ]%'
@Data LIKE '[AA,BB,CC]' + CHAR(32) + '%'

hier kommen sogar false positives zustande:
@Data = 'AA1'
@Data LIKE '[AA,BB,CC][A-C]%'

Sonderzeichen wie Punkt, Komma, etc. funktionieren auch in Wertelisten ganz gut. Aber mir ist irgendwie überhaupt nicht klar wann was funktioniert. Auch _ für ein belibiges Zeichen funktioniert an der Stelle des Leerzeichens nicht.
Mitglied: GrueneSosseMitSpeck
01.04.2019, aktualisiert um 09:16 Uhr
Gibt eine Million Treffer mit "masking regular expressoins in sql". Blank ist übrigens \s

und hier steht der Rest:

Stackoverflow - Erklärung für Regex in Where klauseln
Bitte warten ..
Mitglied: ukulele-7
01.04.2019, aktualisiert um 10:40 Uhr
Zunächst mal Danke für den Versuch aber Google habe ich natürlich auch bemüht. Dein Treffer und \s etc. sind für MySQL, ich habe MSSQL 2014.
https://docs.microsoft.com/de-de/sql/t-sql/language-elements/like-transa ...

Meine Probleme haben eine andere Ursache. Scheinbar unterstützt LIKE die Angabe einer Werteliste mit , getrennt in eckigen Klammern nicht. Das scheint nur mit patindex() zu gehen.

PS: Okay unter gewissen umständen läuft es mit der Werteliste scheinbar, alles sehr seltsam.
Bitte warten ..
Mitglied: 139374
01.04.2019, aktualisiert um 19:09 Uhr
Baut man sich halt eine Regex Custom User Skalar Function für MSSQL
Bitte warten ..
Mitglied: MadMax
LÖSUNG 03.04.2019 um 20:32 Uhr
Hallo ukulele,

das funktioniert schon alles richtig, auch Dein "false positive".

Was in eckige Klammern eingeschlossen ist, ist der mögliche Wertebereich für genau ein Zeichen. Da darfst Du auch Listen und Bereiche kombinieren. Steht übrigens sehr schön in der Hilfe zu dem Befehl like

Wenn Du ein bestimmtes Zeichen an einer Stelle suchst, dann brauchst Du auch keine eckigen Klammer, es sei denn, es ist ein Joker wie z.B. % oder _.

Dein Beispiel für das falsche Ergebnis erklärt sich also so:
@Data = 'AA1'
@Data LIKE '[AA,BB,CC][A-C]%'
Erstes Zeichen muß bei den Zeichen in der ersten eckigen Klammer sein, also A, B, C oder das Komma. Daß die Zeichen doppelt aufgeführt sind, stört offensichtlich nicht. Das erste Zeichen erfüllt jedenfalls die Bedingung, A ist in der Auflistung enthalten.
Das zweite Zeichen muß im Bereich A-C sein. das ist auch erfüllt.
Der Rest ist dann beliebig. Bedingung ist also erfüllt.

Wenn Du also am Anfang AA oder BB oder CC erwartest, dann müßtest Du das anders machen, nämlich:
@Data like 'AA%' or @Data like 'BB%' or @Data like 'CC%'
oder
left (@Data, 2) in ('AA', 'BB', 'CC')

Gruß, Mad Max
Bitte warten ..
Mitglied: ukulele-7
03.04.2019 um 21:43 Uhr
Ja danke nochmal für die Klarstellung. Nachdem ich nochmal alles nach "Wertelisten" mit mehr als einem Buchstaben abgesucht habe musste ich das auch so schlussfolgern. Offensichtlich habe ich hier früher theoretisch Fehler gemacht die aber nicht relevant waren, eben weil das , auch ein Wert war der gesucht wurde.

Auch wichtig zu wissen das patindex() und LIKE die selbe Syntax akzeptieren.

Leider suche ich im Text stellen die mit 2, 3 oder 4 Buchstaben anfangen, dann wahlweise einen Leerschritt haben oder eben auch nicht und auf die dann eine Zahl mit bis zu 7 Stellen folgt. Da es keine Möglichkeit gibt zwischen z.B. Leerschritt oder kein Zeichen in LIKE zu unterscheiden nur immer ziwschen Leerschritt oder einem anderen Zeichen (über die Werteliste) sind die möglichen Kombinationen zahlreich.

Ich werde versuchen es mit SQL Mitteln zu lösen, vielleicht baue ich mir hier eine Funktion. left() ist schon ein sinniger Ansatz, vielleicht in Kombination mit replace() um das Leerzeichen, falls vorhanden zu killen.
Bitte warten ..
Mitglied: MadMax
04.04.2019 um 01:27 Uhr
Hallo ukulele,

für patindex hatte ich bis jetzt noch nicht wirklich Verwendung, aber ja, in der Hilfe steht, daß es wie like funktioniert.

Aber dann ist es doch relativ einfach, solche Texte aufzuteilen. Wenn es wirklich wie like funktioniert, findet man mit "select patinidex ('%[0-9]%', @Data)" die erste Ziffer. Ob davor ein Leerzeichen oder zwei bis vier Buchstaben stehen, kann man dann ja einfach ermitteln.

Gruß, Mad Max
Bitte warten ..
Heiß diskutierte Inhalte
Ubuntu
HAProxy-Wi: Installation des Pakets geht nicht - ich hätte keine enabled Repos
itnirvanaFrageUbuntu37 Kommentare

Hallo, von der Seite möchte ich gerne HAProxy-Wi installieren ich führe das hier aus Dann kommt -> There ar ...

LAN, WAN, Wireless
Wlan Messgerät
gelöst fizlibuzliFrageLAN, WAN, Wireless23 Kommentare

Hallo, gibt es erschwingliche Messgeräte um vorhanden W-Lan ausleuchtungen in ihrer Signalstärke und Bandbreite zu messen. Es sollen einfache ...

Microsoft
Failover Cluster Network
samreinFrageMicrosoft22 Kommentare

Hallo zusammen, toller Freitag heute vielleicht kann mir jemand unter die Arme greifen. Ich habe einen Failover Cluster gebaut. ...

Router & Routing
Kaufempfehlung WLAN Router mit VLAN Unterstützung
ccreccFrageRouter & Routing20 Kommentare

Hallo zusammen, ich wollte mal nach einer Kaufempfehlung für einen WLAN Access Point mit halbwegs vernünftiger VLAN Unterstützung fragen. ...

Windows Installation
Einmaliger Betriebssystem Rollout
StUffzFrageWindows Installation15 Kommentare

Hallo liebes Forum, Baramundi, SCCM, ZENworks & Co sind Softwareverteilungssysteme für eher "größere" Unternehmen ich bin auf der Suche ...

Switche und Hubs
LAN Kabel, Lasche bricht
NebellichtFrageSwitche und Hubs14 Kommentare

Hallo Freunde, leider kommt es doch schon mal vor, dass die Lasche am LAN-Kabel abbricht und der Stecker nicht ...

Ähnliche Inhalte
Entwicklung
Regular Expression für Finanz
gelöst DocuSnap-DudeFrageEntwicklung10 Kommentare

Hallo, kann mir jemand kurz helfen: ich brauche für Eingabefelder in einer .NET-basierten Maske einen speziellen Software (hintendran eine ...

Entwicklung

Benötige Hilfe bei Regular Expression

gelöst Thomas91FrageEntwicklung6 Kommentare

Hallo, ich benötige hilfe bei einem Regularen Ausdruck: dieser sollte wenn möglich ohne /ig auf zwei Zeilen einen treffer ...

PHP

Regular Expression richtig einsetzen? Please Help

solnetsoFragePHP8 Kommentare

Hallo Leute, ich hätte gerne gewusst,wie ich die Werte :Adresse ,Plz,und Stadt durch regex erreichen kann ? mein Formel ...

IDE & Editoren

Textfile regular Expressions

gelöst brammerFrageIDE & Editoren3 Kommentare

Hallo, ich stelle mich mit Regex gerade ein bisschen dämlich an Ich möchte in einer Textdatei alles nach einer ...

Batch & Shell

(Powershell) - If Statement in Expression

gelöst ThunderbirdOFrageBatch & Shell3 Kommentare

Hey, ich habe hier ein Skript, welches mir benötigte Infos über AD Benutzer in eine CSV Datei exportiert. Das ...

Datenbanken

MSSQL Substring

gelöst DocuSnap-DudeFrageDatenbanken6 Kommentare

Hallo, heute habe ich folgende Hearusforderung: Tabelle1 (Netzwerkbereichsdefintionen) Tabelle 2 (Geräteliste) Ziel nun in SQL: gib mir Gerätenamen und ...

Berechtigungs- und IdentitätsmanagementBerechtigungs- und IdentitätsmanagementWebdienste und -serverWebdienste und -serverDatenbankenDatenbankenMonitoring & SupportMonitoring & SupportHybrid CloudHybrid CloudSmall Business ITSmall Business IT