【问题标题】:Using 'IN' clause for strings in Sql对 Sql 中的字符串使用“IN”子句
【发布时间】:2017-02-02 01:08:13
【问题描述】:

您好,我有一个有 2 列的表格。 Name varchar(50)RoleType Varchar(500)

我在表格中有如下 img 的数据。

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

我尝试使用以下查询,但它不起作用。

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

【问题讨论】:

  • 真正的问题是你有一张桌子急需重新设计stackoverflow.com/a/41215681/267540
  • 将逗号分隔的 id 分成几行,以防万一您不想重新设计表架构 ...然后将该 id 存储到临时表中,然后对该临时表执行操作

标签: mysql sql-server


【解决方案1】:

使用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'))

首字母:

输出:

【讨论】:

    【解决方案2】:
    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】:

      Sandip Patel 的拆分解决方案很好。 不过,您可以根据需要使用 LIKE。

      你可以写类似的东西

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 错误!这将根据给定的 OP 返回 0 行。
        猜你喜欢
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-27
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多