使用sql在字符串中的多个值上获取多个id?

时间:2015-05-12 08:49:05

标签: sql sql-server

我有一张像

这样的表

TBL

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

在此表中,我希望用户获取id和name 即用户[2]具有哪个ID和名称

假设我通过了用户[2],那么我得到的结果是1和3,并命名为acc1和acc3。

4 个答案:

答案 0 :(得分:1)

试试这个会对你有用

if(!empty($_q4)){
  foreach($_q4 as $a4) {
   $q4 .= $a4;
  }
}

答案 1 :(得分:1)

您可以使用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' 

答案 2 :(得分:0)

使用LIKE功能

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

答案 3 :(得分:0)

您不应该在数据库中存储分隔值,但这里有一个解决方案,可以规范化数据:

;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