我使用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)是第一次匹配还是评估所有可能性并分配最高排名?
答案 0 :(得分:7)
是的,案例陈述的顺序很重要。第一个匹配的行将是返回的行。
所以,这句话:
(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)