一尘不染

SQL CASE:WHEN语句的顺序重要吗?

sql

我正在使用PHP生成需要以自定义方式排序的SQL查询。我正在生成一个CASE带有多个WHEN分配数字排名的语句的块。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更加冗长和丑陋。

TL; DR?

因此, 简短的问题
是:WHEN语句在语句中的顺序CASE重要吗?SQL(我使用的是Oracle)是否匹配第一个匹配项,或者它会评估所有可能性并分配最高排名?


阅读 549

收藏
2021-03-10

共1个答案

一尘不染

是的,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)
2021-03-10