我正在使用PHP生成需要以自定义方式排序的SQL查询。我正在生成一个CASE带有多个WHEN分配数字排名的语句的块。WHEN包含的语句取决于我可以查询多少信息。例如,如果我有一部电话,我将生成三个WHEN语句:
CASE
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更加冗长和丑陋。
THEN 1
THEN 2
TL; DR?
因此, 简短的问题 是:WHEN语句在语句中的顺序CASE重要吗?SQL(我使用的是Oracle)是否匹配第一个匹配项,或者它会评估所有可能性并分配最高排名?
是的,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),因为将永远不会处理最后两个条件:
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)