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

如何使SQL Where子句短路

哈雅珺
2023-03-14
问题内容

我正在尝试在SQL Server中执行以下查询:

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * FROM TABLE_1 
WHERE (ISDATE(@queryWord) = 1) 
AND TABLE_1.INIT_DATE = CONVERT(Date, @queryWord)

显然这会导致错误,因为无法将“ asdas”转换为Date。虽然,我期待一个不同的行为。也就是说,因为ISDATE(@queryWord) = 1为假,所以我期望SQL不检查第二个条件,但显然可以。

我知道还有其他一些方法可以执行此查询,但这不是我的问题。我想知道是否有某种方法可以不检查第二个条件,即第一个条件不满足。我很好奇,因为我认为SQL已经做到了这一点。


问题答案:

SQL Server不会短路(也不应短路)。

如果您需要它在某些情况下不 尝试 某些操作,则需要以编写查询的方式强制执行该操作。

对于此查询,最简单的解决方法是CASEWHERE子句中使用表达式。

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * FROM TABLE_1 
WHERE TABLE_1.INIT_DATE = (CASE WHEN ISDATE(@queryWord) = 1 
                                THEN CONVERT(Date, @queryWord)
                           ELSE NULL  END)

CASE我可以想到仅使用副手和查询嵌套就可以强制对SQL中的依赖条件进行求值顺序的两种受支持的方法。



 类似资料:
  • 我使用OpenNLP Java API进行句子标记化,它使用空格字符来标记句子,并拆分每个单词。 有没有什么方法可以让我跳过一些特定单词的分词或标记化。 例如在句子中。“一只敏捷的棕色狐狸跳过懒狗”。OpenNLP将句子拆分/标记为 一只 快速 棕色 狐狸 跳过 懒惰的 狗 我想跳过单词“Quick brown Fox”和“Lazy Dog”的标记化,因此预期的输出将是 一只 快速的棕色狐狸 跳过

  • 问题内容: 在SQL中,有什么方法可以缩短语法 到 一次又一次地在子句中写入相同的列名是不可行的。 问题答案: 没有没有办法将LIKE与IN 直接 结合 __ 有很多解决方法,例如本例中的SQL Server 这会将多个OR搜索条件更改为行和JOIN 或者,您可以使用UNION将多个查询合并为一个

  • 我试图用NLTK从句子中提取介词短语。有没有一种方法可以让我自动做到这一点(例如,向函数输入一个句子,然后返回它的介词短语)? 这里的例子似乎要求你先从语法开始,然后才能得到解析树。我能自动获取语法并使用它来获取解析树吗? 显然,我可以标记一个句子,挑出介词和后面的名词,但当介词补语是复合词时,这很复杂。

  • 问题内容: 我正在使用iBATIS创建选择语句。现在,我想用iBATIS实现以下SQL语句: 使用以下方法,语句准备不正确,并且没有结果返回: iBATIS似乎重新构建了该列表,并尝试将其解释为字符串。 如何正确使用IN子句? 问题答案: 这是一篇博客文章,回答您的问题: iBatis:使用SQL IN关键字支持数组或列表参数 在Java中,您应该传入java.util.List。例如

  • 问题内容: 请提供有关在哪里可以找到lib的建议,以便使用的简短表达,以及在哪里放置该lib。 问题答案: 您可以使用日志记录库,而不是重新发明轮子。Log4j的例如将为喜欢不同消息的方法,和。 自制方法 或简单地制作自己的方法并调用它: IDE键盘快捷键 IntelliJ IDEA和NetBeans: 键入,然后按,它会为您键入,将光标放在正确的位置。 蚀: 输入,然后按+ 。 其他 查找您喜欢

  • 问题内容: 有哪些方法可以过早退出子句? 有时候,我在编写代码时希望将一条语句放在子句中,只是要记住,这些语句只能用于循环。 让我们以以下代码为例: 我可以想到一种方法:假设退出情况发生在嵌套的if语句内,请将剩余的代码包装在一个大的else块中。例: 问题是更多的退出位置意味着更多的嵌套/缩进代码。 另外,我可以编写我的代码以使子句尽可能小,并且不需要任何退出。 有人知道退出子句的好/更好的方法