在Sql中为字符串使用'IN'子句

时间:2016-12-23 10:54:53

标签: mysql sql-server

嗨我有2列的表。 Name varchar(50)RoleType Varchar(500)

我的数据如下表img所示。 enter image description here

现在我将roletype 2和4作为参数传递,并希望获得roletype列中Roletype为2或4的所有数据。例如,2和4 roletype的结果是测试a,测试d,测试c和测试e。

我尝试使用以下查询,但它无效。

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

4 个答案:

答案 0 :(得分:4)

使用拆分功能拆分逗号分隔的列值:

分割功能:

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

答案 1 :(得分:0)

尝试使用以下查询获取所需的输出 -

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

答案 2 :(得分: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');

答案 3 :(得分:0)

Sandip Patel的拆分解决方案很好。 不过,如果需要,你可以使用LIKE。

您可以编写类似

的内容
SELECT
    *
FROM
    Userinfo
WHERE
    Roletype LIKE '%,2,%'
OR Roletype LIKE '2,%'
OR Roletype LIKE '%,2' etc.