【问题标题】:SQL CASE: Does the order of the WHEN statements matter?SQL 案例:WHEN 语句的顺序是否重要?
【发布时间】:2014-03-25 16:39:39
【问题描述】:

我正在使用 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)是否与第一个匹配项一起使用,还是会评估所有可能性并分配最高排名?

【问题讨论】:

  • 是 - 将使用第一个匹配的 WHEN 条件 - 如果您碰巧有多个匹配项,则取决于它们出现的顺序
  • 是的,当然。就像一个失败的场景一样工作,如果一个 WHEN 满足条件,那么它会停止检查其余的条件。
  • does it evaluate all of the possibilities and assign the highest ranking? =否(如果尚未明确)

标签: sql sql-order-by


【解决方案1】:

是的,案例陈述的顺序确实很重要。第一个匹配的行将是返回的行。

所以,这句话:

(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多