2016-12-23 3 views
2

Привет У меня есть таблица, которая имеет 2 столбца. Name varchar(50) и RoleType Varchar(500).Использование предложения «IN» для строк в Sql

У меня есть данные как ниже img в таблице. enter image description here

Теперь я передаю roletype 2 и 4 в качестве параметра и хочу, чтобы получить все данные, которые имеют roletype 2 или 4 в Roletype колонки. Например, результат для 2 и 4 roletype - это тест a, тест d, тест c и тест e.

Я пробую с запросом ниже, но он не работает.

SELECT * FROM Userinfo where Roletype in ('2', '4')

+2

реальная проблема здесь состоит в том, что у вас есть таблица остро нуждается в редизайне http://stackoverflow.com/a/41215681/267540 – e4c5

+0

разорвать вашу запятую идентификатор в строки, если вы не хотите перепроектировать вашу архитектуру таблицы ... затем сохраните этот идентификатор во временную таблицу и затем выполните операцию над этой временной таблицей –

ответ

4

Использование Функция Split разделить разделенных запятыми значений столбцов:

Сплит функция:

CREATE FUNCTION [dbo].[fnSplit] 
(
    @String NVARCHAR(4000), 
    @Delimiter NCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
     'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 

Теперь обновите свой запрос, как показано ниже:

SELECT * 
FROM Userinfo 
WHERE EXISTS (SELECT Data 
       FROM [dbo].[fnSplit] (Roletype,',') 
       WHERE Data IN (2, 4)) 

Пример:

SELECT * 
FROM Category 

SELECT * 
FROM Category C 
WHERE EXISTS (SELECT * 
       FROM [dbo].[fnSplit] (Name, ',') 
       WHERE DATA IN ('test', 'test3')) 

Начальное:

enter image description here

Выход:

enter image description here

+0

Спасибо, что он работает отлично. – Hitesh

0

Попробуйте использовать ниже запрос для получения нужного выхода -

SELECT 
    * 
FROM 
    Userinfo 
WHERE 
    Roletype = '2' 
OR Roletype = '4'; 
+0

Err !! Это приведет к возврату 0 строк в соответствии с данными ОП. – GurV

0
SELECT 
    * 
FROM 
    [Userinfo] AS [ui] 
CROSS APPLY 
    (
    SELECT 
     [str] = [X].[C].[value]('(./text())[1]', 'nvarchar(4000)') 
    FROM 
     ( 
      SELECT 
       [X] = CONVERT(XML, '<i>' + REPLACE([ui].[roletype], ',', '</i><i>') + '</i>').query('.') 
     )     AS [A] 
    CROSS APPLY 
     [X].[nodes]('i') AS [X]([C]) 
    )   AS [s]   
WHERE 
    [s].[str] IN ('2', '4'); 
0

Сплит-решение от Sandip Patel - это хорошо. Тем не менее, вы можете использовать LIKE, если хотите.

Вы можете написать что-то вроде

SELECT 
    * 
FROM 
    Userinfo 
WHERE 
    Roletype LIKE '%,2,%' 
OR Roletype LIKE '2,%' 
OR Roletype LIKE '%,2' etc. 
Смежные вопросы