Искать в столбце с разделителями - PullRequest
1 голос
/ 03 апреля 2012

У меня есть строка поиска, подобная этой: 'value1, value4, value8'

У меня есть таблица базы данных с такой записью:

id   |    value
-----+------------------------
1    |    value1,value2,value3
2    |    value3,value4,value9
3    |    value4,value8,value9
4    |    value2,value3,value9

Теперь я ищуспособ поиска всех записей из базы данных, которая содержит значение1, значение4 или значение 8.

В этом примере я хочу записи 1, 2 и 3, когда я делаю выбор.

У меня уже есть разделениефункция, которая разбивает мою строку поиска на IN VALUES следующим образом: 'value1', 'value4', 'value8', но я не могу заставить ее работать, чтобы выбрать правильные записи.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Может быть, что-то вроде этого:

Данные испытаний

CREATE TABLE Table1
(
    id INT,
    value VARCHAR(200)
)
INSERT INTO Table1
VALUES
    (1,'value1,value2,value3'),
    (2,'value3,value4,value9'),
    (3,'value4,value8,value9'),
    (4,'value2,value3,value9')

Функция разделения

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO

Запрос

DECLARE @searchString VARCHAR(100)
SET @searchString='value1,value4,value8'
;WITH CTE
AS
(
    SELECT 
        split.s as searchString
    FROM 
        dbo.Split(',',@searchString) AS split
)
SELECT
    *
FROM
    Table1
WHERE EXISTS
(
    SELECT
        NULL
    FROM
        dbo.Split(',',Table1.value) AS split
    WHERE EXISTS
    (
        SELECT
            NULL
        FROM
            CTE
        WHERE
            CTE.searchString=split.s
    )
)

Результат

id      value
1       value1,value2,value3
2       value3,value4,value9
3       value4,value8,value9

Редактировать

Эта функция разделения использует разделитель и varchar для разделения. Это рекурсивная функция, которая вычисляет начало и конец того места, где находится введенный sperator varchar. Когда вычисляются начало и конец, substring - это простая задача для выполнения.

0 голосов
/ 03 апреля 2012

Чтобы получить то, что вы просите, я думаю, что вам нужно либо вставить разделенные результаты (без одинарных кавычек) во временную таблицу, либо заставить вашу функцию разделения вернуть таблицу. Тогда вы можете сказать:

SELECT column1, column2, column3 
FROM table1
WHERE value in (select * from #values)

OR

WHERE value in (select * from dbo.StringSplitFunc(...))

в зависимости от выбранного вами подхода.

0 голосов
/ 03 апреля 2012

, если у вас есть совпадающие значения в коде, и он будет статическим, это может сработать:

select * from table where value like '%value1%' and value like '%value4%' and value like '%value8%'

Это если вы хотите, чтобы оно содержало все значения.Если вы хотите, чтобы он содержал или, или вы переключаете 'и' для 'или'

Редактировать:

Имея значения в коде, вы можете динамически строить оператор SQL в коде.

string statement = "select * from table where value like '%value%'";
foreach (string value in collectionOfValues) {
      statement += " and value like '" + value + "'";
}

Я бы, конечно, использовал SqlParameters вместо того, чтобы ставить значение непосредственно в операторе, но вы поймете мой дрейф.

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