[英]check contain item in comma separated list as a query result in sql server
我在SQL Server中有一个Post表,出于性能原因,该表有一个以逗号分隔值形式的列(UsersWhoLiked),用于指定喜欢以下Post的UserId。
Id | Subject | UsersWhoLiked
---|---------|-----------
1 | red | u1,u2
2 | blue | u2, u3,u4,u5
3 | green |
4 | gray | u3, u4, u7
我想编写一个将UserId作为参数并返回结果列表的查询,以便在结果中,每个帖子都有一个列来指定用户喜欢还是不喜欢该帖子。
示例:对于UserId:u3
我希望:
Id | Subject | Liked
---|---------|-----------
1 | red | 0
2 | blue | 1
3 | green | 0
4 | gray | 1
查询:
SELECT Id, Subject FROM Post
但是我不知道如何将喜欢的列添加到选择语句
您可以使用以下内容:
SELECT Id, Subject,
IIF(CHARINDEX('u3,', REPLACE(CONCAT(UsersWhoLiked, ','), ' ', '')) > 0, 1, 0) AS Liked
FROM Post
您应该使用第二个表来存储点赞:
CREATE TABLE PostLikes (
PostId INT FOREIGN KEY REFERENCES Post(Id),
UserId INT FOREIGN KEY REFERENCES Users(Id),
CONSTRAINT PK_PostLikes PRIMARY KEY (PostId, UserId)
);
因此,您可以使用以下SELECT
获取所需的信息:
SELECT Id, Subject, IIF(ISNULL(PostLikes.UserId, 0) > 0, 1, 0) AS Liked
FROM Post LEFT JOIN PostLikes ON Post.Id = PostLikes.PostId AND PostLikes.UserId = 3
您可以尝试以下方法:
DECLARE @id varchar(10)='u3'
SELECT Id, Subject,
CASE WHEN (',' + UsersWhoLiked + ',') LIKE '%,'+@id+',%' THEN 1 ELSE 0 END Liked
FROM Post
我不存储逗号分隔的值如何提高性能,但这不是一个好主意。 在您的情况下,应该小心使用子字符串。 例如,如果您正在寻找u3
,则它不应与u31
匹配。 因此,
在UsersWhoLiked
列中的每个值之前和之后UsersWhoLiked
declare @userId varchar(10) = 'u3'
select
Id, Subject
, Liked = isnull(sign(charindex(',' + @userId + ',', ',' + UsersWhoLiked + ',')), 0)
from Post
select *, case PATINDEX('%u3%', userwholikes) --dont use u3(comma), only use u3
when 0 then --because u3 becomes last one
0
else 1
end likes
from yourtable
根据我的理解,我给出了这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.