SQL 中的案例语句 - 过程的性质
Posted
技术标签:
【中文标题】SQL 中的案例语句 - 过程的性质【英文标题】:Case Statements in SQL - Nature of the Process 【发布时间】:2018-11-07 19:42:32 【问题描述】:我正在用 SQL 编写案例语句,以确定员工是退伍军人还是退伍军人配偶。包含数据的三个字段和逻辑是:
1) 如果三个字段中的任何一个表示老兵,则此人是老兵 2) 如果没有一个表示老兵,但最后一个表示配偶,则此人是配偶
我写了一个似乎可行的案例陈述:
CASE
WHEN Flag1 = 'Vet' THEN 'Veteran'
WHEN Flag2 = 'Vet' THEN 'Veteran'
WHEN Flag3 = 'Vet' THEN 'Veteran'
WHEN Flag3 = 'Spouse' THEN 'Veteran Spouse'
ELSE 'Non Veteran/Spouse'
END
我想知道这是否可行,因为我的数据中没有导致失败的场景,而不是因为它写入正确。例如,我没有数据表明前 2 个标志中的一个表示 vet 并且标志 3 是配偶(我希望将其显示为 vet)。我想知道的是:当 case 语句首先出现时,如果它是肯定的,它是对记录采取行动并移动到下一行,还是在满足这些条件时查看下一个时间并采取行动更改响应(例如:如果 flag1 为 vet,则 case 语句输出为 Veteran。如果同一行在 flag3 中包含单词配偶,记录是否会更改为 Veteran Spouse?)
【问题讨论】:
您可以在数据中添加失败案例并查看 我认为示例图像的最后一行相对于解释的文本是错误的。您应该避免发布图片,而是将此类示例数据构建为预先格式化的文本,以便我们这些不总是看到图片的人更容易修复和帮助您。 您拥有的是CASE
表达式。 CASE
语句 也确实存在,但在 SQL 中不存在。 (它们存在于编程语言 PL/SQL 中,您不需要知道。)然后:只要 FIRST 条件(在几个 WHEN
子句中)出现,CASE
表达式的计算就会停止true
。 CASE
表达式的计算结果为对应的 THEN
表达式,CASE
表达式的其余部分被忽略。您的代码是正确的,并且完全按照您的预期工作,正是出于这个原因。
case when 'Vet' in (Flag1, Flag2, Flag3) then 'Veteran' when 'Spouse' in (Flag1, Flag2, Flag3) then 'Veteran Spouse' else 'Non Veteran/Spouse' end
【参考方案1】:
你所拥有的是正确的。数据库将按顺序评估WHEN
条件并使用匹配的第一个条件。
为了好玩,你也可以这样写:
CASE WHEN 'Vet' IN (Flag1, Flag2, Flag3) THEN 'Veteran'
WHEN Flag3 = 'Spouse' THEN 'Veteran Spouse'
ELSE 'Non Veteran/Spouse'
END
如果这些值位于可以加入的小型查找表中,那就更好了。
【讨论】:
【参考方案2】:乔尔的回答是更安全的逻辑。但具有讽刺意味的是,您可以更简单地做到这一点:
select greatest(flag1, flag2, flag3)
【讨论】:
以上是关于SQL 中的案例语句 - 过程的性质的主要内容,如果未能解决你的问题,请参考以下文章
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?
数字信号处理傅里叶变换性质 ( 傅里叶变换频移性质 | 证明过程 )