SQL CASE语句:WHEN子句的顺序是否重要?

7

我正在使用PHP生成一个需要按照自定义方式排序的SQL查询。我正在生成一个带有多个WHEN语句的CASE块,这些语句分配了数字排名。包括在内的WHEN语句取决于我可用于查询的信息量。例如,如果我有电话号码,则会生成三个WHEN语句:

WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1

WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2

WHEN phone = '(202) 555-5555' THEN 3

因此,我的排名是基于匹配的接近程度,并且将参数赋予相同的价值(在电话、名字和姓氏匹配的情况下,与地址、名字和姓氏匹配的情况相同)。但是,在为多个信息(电话、地址等)生成这些语句之后,我的WHEN语句将全部无序; THEN 1终止子句将相互分开,THEN 2也是如此,以此类推。我可以按顺序放置它们,但那会使我的PHP更冗长和丑陋。

简而言之?

因此,问题是:在CASE语句中,WHEN语句的顺序是否重要? SQL(我正在使用Oracle)会匹配第一个还是评估所有可能性并指定最高排名?


1
是的 - 第一个匹配的 WHEN 条件将被使用 - 如果您恰好有多个匹配条件,则取决于它们出现的顺序。 - marc_s
1
是的,完全正确。它的工作方式就像一个“顺流而下”的情景,如果一个WHEN语句满足条件,那么就不再检查其余的条件了。 - SoulTrain
不是的(如果还没有明确说明的话) - Paul Maxwell
1个回答

13

是的,case语句的顺序很重要。第一个匹配的行将被返回。

因此,这个语句:

(CASE WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1
      WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2
      WHEN phone = '(202) 555-5555' THEN 3
 END)

可能会返回 1、2 或 3(或 NULL)。由于最后两个条件永远不会被处理,因此以下内容将始终返回 3(或 NULL):

(CASE WHEN phone = '(202) 555-5555' THEN 3
      WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2
      WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1
 END)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接