2017-06-26 1 views
-1

Ich habe eine Spalte, die eine Textzeichenfolge ist, die eine durch Kommas getrennte Liste von IDs enthält. Es könnte wie folgt aussehen:Überprüfen Sie, ob eine durch Kommas getrennte Liste eine bestimmte Nummer enthält

1,2,3,45,65,23245,564747,23,121,54,65,345678

Ich brauche zu finden, wenn es eine spezifische ID enthält oder nicht. Zu bekommen, wenn es nur eine Zahl enthält, wäre ziemlich einfach mit einem regulären Ausdruck zu tun, aber das Problem ist, dass zum Beispiel die ID 4 nicht in der Liste ist, aber viele der IDs eine 4 enthält. Vielleicht ist es immer noch möglich zu schreiben ein regulärer Ausdruck, der damit umgehen kann, aber das ist über meinem Niveau. Oder gibt es eine andere Möglichkeit, dies in SQL zu lösen?

EDIT

Nur um zu klären, ich habe nicht wirklich eine Spalte eine durch Kommata getrennte Liste enthält. Was ich habe, ist eine Listagg, die aus mehreren Zeilen einer Abfrage besteht, und ich möchte in der Lage sein, einen Filter darauf anzuwenden. Ich habe einfach versucht, die Frage zu vereinfachen, so dass es sich mehr auf das eigentliche Problem konzentrieren würde. Ich wusste nicht, dass dies zu mehr Antworten auf das Datenbankdesign führen würde als auf die eigentliche Frage.

+0

Wenn Sie kommaseparierte Listen in Ihrer SQL-Datenbank haben, haben Sie einen Fehler in Ihrem Datenbankentwurf (dh Sie vermissen eine Tabelle). Beheben Sie den Fehler, nicht die Abfrage. – Tomalak

+2

Dies wurde hier mindestens 100 mal gefragt, ich habe gerade einen solchen Thread verlinkt. Die akzeptierte Antwort gibt es auch die akzeptierte Antwort in der Hälfte der Threads mindestens. Keine Notwendigkeit, das Rad neu zu erfinden. – mathguy

Antwort

3

Das Speichern von Werten in einer kommagetrennten Liste ist ein sehr schlechtes Entwurfsmuster, es gibt nur Kopfschmerzen. Wenn Sie können, normalisieren Sie es.

Wenn Sie nicht können, können Sie nach einer bestimmten ID suchen die Kommas im Vergleich mit:

WHERE [Column] LIKE '%,4,%' 
    OR [Column] LIKE '4,%' 
    OR [Column] LIKE '%,4' 
+2

... oder einfach WHERE ',' || [Spalte] || ',' LIKE '%, 4,%' – fhossfel

1

Wie bereits gesagt, durch Komma getrennte Werte sind schlecht, aber wenn man so wie man will, ist dies ein weg:

select * from t where REGEXP_LIKE (col , '(^|,)4(,|$)') 
Verwandte Themen