如何在SQL Server中用多LIKE查询将数据拆分到不同列?
解决方案
你可以通过CASE条件判断来拆分数据到不同列,修改后的查询代码如下:
SELECT -- 匹配'due'的内容放到DueDate列 CASE WHEN sq.[name] LIKE '%due%' THEN CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optiontextresponse)) ELSE NULL END AS DueDate, -- 匹配'doc'的内容放到DocName列 CASE WHEN sq.[name] LIKE '%doc%' THEN CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optiontextresponse)) ELSE NULL END AS DocName FROM [dbo].[tblsubscribeReport] ssr INNER JOIN [dbo].[tblsurveyque] sq ON sq.surveyquestionid = CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.questionid)) LEFT JOIN [dbo].[tblsurveyquestiono] so ON so.surveyquestionoptionid = CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optionid)) JOIN tblSubscribers s ON s.SubscriberID = ssr.SubscriberId WHERE s.ClientID = '12' AND (sq.[name] LIKE '%due%' OR sq.[name] LIKE '%doc%' )
效果说明
执行后会生成两列:
DueDate:仅显示sq.[name]包含'due'的日期数据,其余行对应位置为NULLDocName:仅显示sq.[name]包含'doc'的名称数据,其余行对应位置为NULL
进阶优化(同一行展示同一订阅者的due和doc)
如果希望同一订阅者的日期和名称出现在同一行,可使用分组聚合方式:
SELECT s.SubscriberID, MAX(CASE WHEN sq.[name] LIKE '%due%' THEN CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optiontextresponse)) ELSE NULL END) AS DueDate, MAX(CASE WHEN sq.[name] LIKE '%doc%' THEN CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optiontextresponse)) ELSE NULL END) AS DocName FROM [dbo].[tblsubscribeReport] ssr INNER JOIN [dbo].[tblsurveyque] sq ON sq.surveyquestionid = CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.questionid)) LEFT JOIN [dbo].[tblsurveyquestiono] so ON so.surveyquestionoptionid = CONVERT(VARCHAR(100), DECRYPTBYKEY(ssr.optionid)) JOIN tblSubscribers s ON s.SubscriberID = ssr.SubscriberId WHERE s.ClientID = '12' AND (sq.[name] LIKE '%due%' OR sq.[name] LIKE '%doc%' ) GROUP BY s.SubscriberID
这样每个订阅者的DueDate和DocName会在同一行展示,避免NULL分散的情况。
内容的提问来源于stack exchange,提问作者dotnetdeveloper
相关产品推荐
相关产品推荐

