Где значение в столбце, содержащем значения, разделенные запятыми - PullRequest
42 голосов
/ 10 апреля 2011

Я хочу написать оператор SQL для SQL Server 2008, который выбирает запись, в которой столбец содержит значение, теперь значение в столбце представляет собой список с разделителями-запятыми (обычно - это может быть только одна запись (без начальных запятых) ) так, что при проверке «это значение содержится где-то в списке?», например:

COLUMN = Cat, Dog, Sparrow, Trout, Cow, Seahorse
Does COLUMN contain Cat? YES
Does COLUMN contain horse? NO
Does COLUMN contain Sheep? NO

или

COLUMN = Mouse
Does COLUMN contain Hare? NO
Does COLUMN contain Mouse? YES

и т.д.

Я думал, что могу использовать ключевое слово IN как таковое

SELECT id_column FROM table_name WHERE 'Cat' IN COLUMN

но это не работает, так как кажется, что вы можете использовать это только для проверки, содержит ли столбец одно из ряда значений, разделенных запятыми.

Я также не могу использовать CONTAINS () ИЛИ «LIKE», так как в приведенном выше примере будут возвращаться значения «horse», поскольку вся строка содержит лошадь в «Seahorse», и я не могу найти иглу плюс запятая (если я ищу «лошадь», поиск будет «лошадь»), а что, если запись находится в конце списка? И я не могу найти запятую и иглу (если я ищу «лошадь», поиск будет «лошадь») а что если запись является первой в списке? И я не могу использовать оба, так как если запись является единственной (единственной) записью?

Ответы [ 13 ]

0 голосов
/ 22 декабря 2016

Если вы знаете идентификаторы, а не строки, используйте этот подход:

where mylookuptablecolumn IN (myarrayorcommadelimitedarray)

Просто убедитесь, что myarray или commadelimitedarray не помещены в строковые кавычки.

работает, если вы хотите A ИЛИ B, но не AND.

0 голосов
/ 25 апреля 2012
SELECT * FROM TABLE_NAME WHERE
        (
            LOCATE(',DOG,', CONCAT(',',COLUMN,','))>0 OR
            LOCATE(',CAT,', CONCAT(',',COLUMN,','))>0
        );
0 голосов
/ 10 апреля 2011

Поскольку вы не знаете, сколько записей, разделенных запятыми, вы можете найти, вам может потребоваться создать функцию с функциями SQL Server 'charindex' и 'substring'.Значения, возвращаемые функцией, могут использоваться в выражении «in».

Вы можете вызывать рекурсивную функцию или создавать цикл, ища записи, пока в строке не останется больше записей.Каждый вызов функции использует предыдущий найденный индекс в качестве отправной точки следующего вызова.Первый звонок начинается с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...