当前位置: 首页 > 面试题库 >

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

姜晨
2023-03-14
问题内容

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


问题答案:

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


 类似资料:
  • 问题内容: 假设我有一个条件: 现在假设那很可能会收到一个真实的值,为什么我要关心左边的那个? 如果将它们都放在方括号中,那么我(作为代码的程序员)知道双方都是需要的。 问题是,我的教授在他的演讲笔记上写道,我应该在左边加上“更可能的变量以得到一个真”。 有人可以解释一下好处吗?好吧,我把它放在左边…我正在获得什么?运行 ? 问题答案: 它不只是在左侧选择最可能的条件。您也可以在左侧设置一个安全门

  • 问题内容: 想知道。排序导入语句的正确方法是哪种?还有哪个更具可读性? 喜欢, 外部类(如),然后是内部包 类。 只是按字母顺序 提前致谢。 问题答案: 从Java编程风格指南中 import语句必须在package语句之后。import语句应首先使用最基本的软件包进行排序,并与相关的软件包分组在一起,并且各组之间应留空行。 ..... ..... 导入语句的位置由Java语言强制执行。通过排序,

  • 问题内容: 我有SQL Server 2008 R2,Windows 7 OS。 在服务器内,我有一个通过以下SQL语句创建的表。 在表中,我具有以下值: 我确实对数据库执行了以下SQL语句: 服务器给我以下错误消息: 转换nvarchar值“ 1”时转换失败。 数据类型为int。 我以为我的内部SQL首先执行并创建了一个临时表,因此它不包含在表中,然后SQL解析器将用于过滤临时表。 但是以上似乎

  • 如果我们有一个由col、col2、col3分区的配置单元表,那么在对该表执行SELECT时,如果我想在WHERE子句中指定这些列,它们是否必须以相同的顺序出现,以便利用分区?我的意思是,逻辑上是的,但无论我以什么顺序指定它们,HIVE编译器都不能理解它们的实际顺序。它应该能够在内部应用正确的顺序,因为HIVE已经知道正确的顺序是col2、col2、col3,所以它以这种方式使用它。HIVE在我们定

  • 问题内容: 如果我有两列,一列具有非常高的基数,而另一列具有非常低的基数(值的唯一数目),那么按哪个顺序分组是否重要? 这是一个例子: 在某些情况下重要吗? 问题答案: 不,顺序对于GROUP BY子句无关紧要。 MySQL和SQLite是我所知道的仅有的数据库,它允许您选择按组方式(非标准,不可移植)从组中省略的列,但是顺序也不重要。

  • 我正在努力正确设置IF语句,基本上我想检查J列中是否有数据,如果为空,继续脚本的其余部分,如果有数据,询问用户是否希望继续,然后根据他们的响应继续或终止。 以下是我的代码的开头: 问题似乎是当J列中没有数据时,它不会继续导出。 有人想发光吗??