Wenn Sie nur diejenigen auswählen möchten, die eine 1 enthalten, können Sie dies tun:
where colm like '1,%'
or colm like '%,1,%'
or colm like '%,1'
or colm = '1'
Sie sollten sich aber darüber im Klaren sein, dass dies ein Leistungskiller sein wird. Wenn Sie immer Wenn Sie Dinge manipulieren müssen, die kleiner als eine Spalte sind, ist Ihr Datenbankschema schlecht aufgebaut. Die Grund Der Grund, warum die obige Abfrage nicht gut funktioniert, ist, dass es nicht möglich ist, Indizes zu verwenden, um schnell Zeilen zu finden, die die Abfrage erfüllen. Es wird entweder ein vollständiger Tabellen- oder Index-Scan benötigt, um die Zeilen zu erhalten.
Es wäre besser, das Schema so umzugestalten, dass die kommagetrennten Daten in Zeilen einer anderen Tabelle aufgeteilt werden.
Ein Beispiel dafür wäre etwas wie:
PrimaryTable:
id integer primary key
other_stuff varchar(250)
SecondaryTable:
primary_id integer references PrimaryTable(id)
int_val integer
char_val varchar(20)
primary key (primary_id,int_val)
index (int_val)
So können Sie blitzschnelle Abfragen schreiben, im Gegensatz zu dem langsamen Zeug, das Sie vorschlagen:
select p.id, p.other_stuff
from PrimaryTable p, SecondaryTable s
where p.id = s.primary_id
and s.int_val = 1;
(oder die entsprechende explizite Join-Syntax).
Der Grund, warum diese Lösung schneller funktioniert, ist, dass sie einen Index auf SecondaryTable.int_val
um schnell die relevanten Zeilen und den Primärschlüssel der beiden Tabellen für den Abgleich abzurufen.