2015-12-31 4 views
-1

У меня есть таблица, как показано нижеПроверка через запятую значение столбца в диапазоне значений - SQL Server

Id Col 
---- ------ 
1  a 
2  b 
3  a,b 
4  b,c 
5  b,a 
6  c 
7  ab 

Ищу SQL, где пользователь выберите значение «а» или «б» или оба (он может пчела любое количество значений, таких как 'a', 'b') из frontend.

Declare @searchval varchar(max) 
SET @Searchvalue = 'a' 
    Select id from tbl where col in (@Searchvalue) should return 1,3,5 

SET @Searchvalue = 'a,b' 
    select id from tbl where col in (@Searchvalue) should return 1,2,3,4,5 

выше запрос исключает строку, в которой данные поиска находятся вместе.

+3

Вы должны нормализовать таблицу базы данных. @GordonLinoff согласился бы со мной. –

+0

Это структура, которая была запущена ... нам нужно обойти это – Saravanan

+1

@TimBiegeleisen: Я тоже согласен - в полном сердце! Когда все эти самопровозглашенные «разработчики баз данных», наконец, перестанут помещать ** несколько значений ** в одну ячейку данных, нарушая даже ** первую нормальную форму ** реляционного дизайна ??? –

ответ

-1

Все благодарности за ваш вклад. Я тоже признаю, что дизайн БД не подходит. Я решил проблему, разделив значение столбца на переменную таблицы и использовал его в моем запросе

DECLARE @Prog TABLE 
(
UserID INT, 
Program VARCHAR(8000) 
) 
INSERT @Prog 
SELECT UserID, 
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Program 
FROM 
(
SELECT ID,CAST('<XMLRoot><RowData>' + REPLACE(col,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x 
FROM tbl 
)t 
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) 

Select * from @Prog where Program in (@SearchValue) 
0

Что-то вроде этого:

where col = 'a' 
or col like 'a,%' 
or col like '%,a,%' 
or col like '%,a' 
or col = 'b' 
or col like 'b,%' 
or col like '%,b,%' 
or col like '%,b' 
+0

Моим входным значением может быть любое количество vaalues ​​ – Saravanan

+0

Тогда вам нужно построить sql на лету, независимо от того, какой синтаксис вы выберете. –

3

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

Иногда вы застряли в очень плохих решениях других людей. Возможно, самый простой способ построить запрос, который вы хотите это:

where ',' + col + ',' like '%,a,%' or 
     ',' + col + ',' like '%,b,%' 

Если значения на самом деле отдельные буквы, то это может быть упрощен - на самом деле, запятые на самом деле не служат цели в этом случае. Вы можете просто сделать:

where col like '%[ab]%' 
0

It`s многословным, но вы можете заменить, где с CHARINDEX

SELECT t.id FROM t 
JOIN t tt ON CHARINDEX(',a,',CONCAT(',',t.col,','))>0      
GROUP BY t.id 

и второй запрос

SELECT t.id FROM t 
JOIN t tt ON CHARINDEX(',a,',CONCAT(',',t.col,','))>0 
         OR CHARINDEX(',b,',CONCAT(',',t.col,','))>0 
GROUP BY t.id 

FIDDLE

+0

не ограничивается 'a' или 'b', это может быть любое количество символов – Saravanan

0

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

CREATE TABLE #A(
    Id  int, 
    Col  varchar(10)) 

INSERT INTO #A 
VALUES (1, 'a'), 
     (2, 'b'), 
     (3, 'a,b'), 
     (4, 'b,c'), 
     (5, 'b,a'), 
     (6, 'c'), 
     (7, 'ab') 

DECLARE @InExp VARCHAR(255) = 'a,c', 
     @Sep VARCHAR(10) = ','; 

--<Make sure there's at least one separator in the search string  
IF CHARINDEX(@Sep, @InExp) = 0  
    SET @InExp = @InExp + @Sep; 

--Split the search string into parts 
WITH data AS (
    SELECT SUBSTRING(@InExp, 1, CHARINDEX(@Sep, @InExp)-1) AS Chr, CHARINDEX(@Sep, @InExp) as Stop 
    UNION ALL 
    SELECT SUBSTRING(@InExp, Stop + 1, CHARINDEX(@sep, @InExp, Stop)-1) AS Chr, CHARINDEX(@sep, @InExp, Stop + 1) 
    FROM data 
    WHERE Stop > 0 
) 

--Join the parts on your table 
SELECT DISTINCT a.* 
FROM #A a 
    JOIN data d ON CHARINDEX(d.Chr, a.Col) > 0 

DROP TABLE #A; 
Смежные вопросы