【问题标题】:Get multiple id on multiple value in string with sql?使用sql获取字符串中多个值的多个ID?
【发布时间】:2015-05-12 17:28:16
【问题描述】:

我有一张这样的桌子

tbl

---------------------
id  users   name
---------------------
1   2,3     acc1
2   4       acc2
3   2,4,1   acc3
4   4,1     acc4

在此表中,我想按用户获取 id 和 name 即用户 [2] 有哪个 id 和 name

假设我通过用户 [2] 然后我得到结果 id 是 1 和 3 并命名为 acc1 和 acc3。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

试试这个对你有用

    SELECT id,name FROM yourtablename WHERE `users` LIKE '%2%'; 

【讨论】:

  • 对于用例,其中“用户”列的值为 20、200 等。您的 SQL 将无法通过测试用例。
【解决方案2】:

您可以使用 XML 函数拆分这些逗号分隔值,然后在结果中搜索:

DECLARE @table TABLE(id  INT, users   VARCHAR(30), name VARCHAR(30))
INSERT INTO @table VALUES
(1,'2,3','acc1'),
(2,'4','acc2'),
(3,'2,4,1','acc3'),
(4,'4,1','acc4')


SELECT t.id,
       t.name,
       ( c1.value('.', 'varchar(100)') )
FROM   (SELECT id,
               name,
               CAST('<N>' + REPLACE(users, ',', '</N><N>') + '</N>' AS XML)
        FROM   @table) t(id, name, c)
       CROSS APPLY c.nodes('/N') AS t1(c1)
WHERE  ( c1.value('.', 'varchar(100)') ) = '2' 

【讨论】:

    【解决方案3】:

    使用LIKE 函数

    SELECT id, name
    FROM yourtable
    WHERE (user = '2' OR user LIKE '2,%' OR user LIKE '%,2' OR user LIKE '%,2,%')
    

    【讨论】:

    • 如果用户中存在数据 200 而不是 2,3 怎么办?
    • @Matt 这不再需要(或用户 LIKE '%,2,%')
    • @MAC 如果用户是1,2,3
    • (user LIKE '%2,%') 或 (user LIKE '%,2%') 会做@Matt,即使它在中间,它仍然会给出 2 的结果
    • 这是一个糟糕的解决方案。正确的方法是先将值拆分。出于这个原因,这些值首先不应存储为分隔字符串。看我的回答。
    【解决方案4】:

    您不应该将分隔值存储在数据库中,但这里有一个适合您的解决方案,它将标准化数据:

    ;WITH CTE AS (
    SELECT T1.[id], T2.my_Splits AS [user], T1.[name]
    FROM (
      SELECT *,CAST('<X>'+replace(T.users,',','</X><X>')+'</X>' as XML) as my_Xml 
      FROM Table1 T
     ) T1
     CROSS APPLY ( 
     SELECT my_Data.D.value('.','varchar(50)') as my_Splits
     FROM T1.my_Xml.nodes('X') as my_Data(D)) T2)
    SELECT *
    FROM CTE
    WHERE [user] = 2
    

    还有一个工作小提琴:http://sqlfiddle.com/#!6/dcec6/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多