我有以下(简化)表格
表格产品
ID
Title
表格Data_Tags
ID
ForeignID
Tag
为产品ID 1添加了两个标签:' solid'和强大的
下面的查询将返回2行,如果我添加DISTINCT,它将只返回预期的1行。
SELECT Products.ID, Products.Title
FROM Products LEFT OUTER JOIN Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE (Products.ID = 1)
我想在查询中添加一个CASE语句来计算与某些关键字的特定相关性
CASE WHEN CONTAINS(Data_tags.tag, 'solid') THEN 100 ELSE 0 END AS TagsMatch
查询将变为:
SELECT DISTINCT Products.ID, Products.Title, CASE WHEN CONTAINS(Data_tags.tag, 'solid') THEN 100 ELSE 0 END AS TagsMatch
FROM Products LEFT OUTER JOIN Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE (Products.ID = 1)
当运行查询时,它将返回两行,这非常有意义,因为它将为标记' solid'输出100。 (匹配)和0表示标签' strong' (不匹配)
但是我不确定如何修改查询只返回值为0的单行,如果没有相关的标记匹配则为100,如果任何相关的标记匹配则为100。
我还想避免使用子查询来尽可能保持最佳性能。
我正在使用MS SQL Server 2014。
请指教。非常感谢你!
答案 0 :(得分:0)
我一直在努力为您的问题找到解决方案。事实证明1000111是正确的。你不能在没有全文搜索的情况下使用Contains ...如果用的话替换Contains()我认为这应该可以解决你的问题。这是我做的:
Declare @Products table
(ID int,
Title varchar(50))
insert into @Products values (1, 'Test')
Declare @Data_Tags table
(ID int,
ForeignID int,
Tag varchar(50))
insert into @Data_Tags values (1, 1, 'solid')
insert into @Data_Tags values (2, 1, 'strong')
SELECT DISTINCT Products.ID, Products.Title, max(CASE WHEN Data_tags.tag like '%stttt%' THEN 100 ELSE 0 END) AS TagsMatch
FROM @Products Products LEFT OUTER JOIN @Data_Tags Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE (Products.ID = 1)
group by Products.ID, Products.Title
以上返回0,当您更改'%stttt%'到'%solid%'它返回100。
如果这有帮助,请告诉我。
答案 1 :(得分:0)
SELECT Products.ID, Products.Title, max(CASE WHEN Data_tags.tag = 'solid' THEN 100 ELSE 0 END) AS TagsMatch
FROM @Products Products
LEFT OUTER JOIN @Data_Tags Data_Tags
ON Products.ID = Data_Tags.ForeignID
WHERE (Products.ID = 1)
group by Products.ID, Products.Title