我有这个SQL:
SELECT sets.set_id, responses.Question_Id, replies.reply_text, responses.Response
FROM response_sets AS sets
INNER JOIN responses AS responses ON sets.set_id = responses.set_id
INNER JOIN replies AS replies ON replies.reply_id = responses.reply_id
WHERE sets.Sctn_Id_Code IN ('668283', '664524')
部分结果:
我希望将reply_text
和响应列替换为一列,如果它不为null,则将具有响应的值,否则返回应答文本值。我不确定这是否可以通过案例陈述完成,至少没有我挖出的东西让我认为我可以。假设这个我不正确吗?
答案 0 :(得分:0)
您可以使用案例陈述,但COALESCE
会更容易:
Select sets.set_id, responses.Question_Id, COALESCE(responses.Response, replies.reply_text)
From response_sets as sets
inner join responses as responses on sets.set_id = responses.set_id
inner join replies as replies on replies.reply_id = responses.reply_id
where sets.Sctn_Id_Code in ('668283', '664524')
COALESCE允许您列出两个或多个表达式,并获取第一个非空表达式。
答案 1 :(得分:0)
是的,ISNULL(responses.Response, replies.reply_text)
或COALESCE
也有效。有关更多信息和示例,请参阅this post。这article dives更深入ISNULL
vs COALESCE
。
答案 2 :(得分:0)
这是来自Oracle select语句,但如果它在Oracle中有效,那么它也可以在SQL Server中运行(有一些语法更改):
, (case when bseg1.start_dt is null then bseg2.start_dt else bseg1.start_dt end) bseg_startdt
这是在第一个为空时选择第二个开始日期。
当然,特定的SQL Server答案将是更好的选择。