我的数据库(SQL服务器)中有一个组表,其中我有一列成员,其中包含用逗号分隔的用户ID。
我想要做的是选择由具有用户ID的特定用户创建的所有组,或者他/她是该组的成员,方法是在组行的成员列中进行检查。我的查询在下面但不起作用我现在所做的不正确请帮助我如何实现这一目标。
SELECT * FROM Groups WHERE CreatedBy = @userID or Members in (@userID)
答案 0 :(得分:1)
您可以简单地使用LIKE
:
尝试这种方式:
SELECT *
FROM Groups
WHERE CreatedBy = @userID
OR Members = CONVERT(varchar(10),@userID) ---Members only contains @userID (5)
OR Members LIKE CONVERT(varchar(10),@userID)+',%' ---@userID at starting (5,....)
OR Members LIKE '%,'+CONVERT(varchar(10),@userID)+',%' ---@userID at middle (...,5,...)
OR Members LIKE '%,'+CONVERT(varchar(10),@userID) ---@userID at end (...,5)
答案 1 :(得分:1)
首先我要说的是,在大多数情况下,这是一个糟糕的数据库设计。如果可能,您应该将组成员保存在具有组表的外键的其他表中 但是,如果您无法更改数据库设计,可以尝试以下方法:
SELECT *
FROM Groups
WHERE CreatedBy = @UserId
OR ',' + Members + ',' LIKE '%,' cast(@UserId as varchar(10)) +',%'
这样,您可以搜索特定用户是在列表的开头,列表的中间还是列表的末尾。此外,当您搜索用户10时,您将不会错误地获得用户100。
答案 2 :(得分:0)
创建一个函数并使用如下(您可以简单地加入将“IN”更改为“从函数中选择”:
CREATE FUNCTION dbo.fnSplit(
@sInputList VARCHAR(8000) -- List of delimited items
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN (@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO
--Test
select * from fnSplit('1,22,333,444,,5555,666', ',')
select * from fnSplit('1##22#333##444','##') --note second item has embedded #
select * from fnSplit('1 22 333 444 5555 666', ' ')
PFE:http://geekswithblogs.net/AngelEyes/archive/2007/04/12/111504.aspx