可以使用SQL Case语句来选择数据库列

时间:2014-03-11 18:31:13

标签: sql sql-server

我有这个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')

部分结果:

enter image description here

我希望将reply_text和响应列替换为一列,如果它不为null,则将具有响应的值,否则返回应答文本值。我不确定这是否可以通过案例陈述完成,至少没有我挖出的东西让我认为我可以。假设这个我不正确吗?

3 个答案:

答案 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答案将是更好的选择。