sql - 看起来相似的2个条件之间的差异
问题描述
当我看到这两个条件时,我的头脑是盲目的,我无法理解有什么区别。有人可以解释一下吗?第一个返回 273 条记录,第二个返回 93 条记录。我认为它们应该返回相同的记录。
第一
s.value LIKE '%One Travel%'
OR s.value LIKE '%One RSA%'
OR s.value LIKE '%One Other%'
OR s.value LIKE '%GP&U%'
OR s.value = ' '
第二
s.value LIKE (
'%One Travel%'
,'%One RSA%'
,'%One Other%'
,'%GP&U%'
, ' ')
解决方案
我根本不知道 H2,但我假设第二个查询的计算结果为:
s.value LIKE '%One Travel%'
OR s.value LIKE '%One RSA%'
OR s.value LIKE '%One Other%'
OR s.value LIKE '%GP&U%'
OR s.value LIKE ' '
所以你只剩下 和 之间的区别s.value = ' '
了s.value LIKE ' '
。显然 H2 遵循 ANSI SQL,而 ANSI 标准在比较中忽略了尾随空格(实际上要比较的字符串用空格填充,直到它们的长度相同)。所以s.value = ' '
返回 TRUE ' '
,但也为''
和' '
。LIKE
不填充空格进行比较,因为它用于模式匹配而不是相等测试。因此,LIKE ' '
只匹配一个空格。
简而言之; 您的第一个查询会返回更多行,因为value
还会返回空字符串或多个空格的行。您的第二个查询仅返回value
单个空格的行(为简单起见忽略其他条件)。
推荐阅读
- python - 拆分时超出范围(基本)
- kotlin - Kotlin 中类型投影的使用站点与声明站点的差异
- c# - 循环遍历某个字符串的所有出现并用 C# 中的不同值替换每个字符串?
- r - 在 R 中使用行函数时出现意外的“,”
- jquery - 如果选中单选按钮,则显示隐藏 div
- c++ - 使用均匀分布的随机数进行蒙特卡罗模拟
- typescript - 在 TypeScript 中循环设置对象字段
- android - 在没有 GUI 和 HAL 的 android 系统上解决配对 pin 交换
- javascript - 如何在 Next.js 中过滤道具?无法从 Next.js 中的 componentDidMount 过滤道具中的数据
- coq - Coq:在“隐式”之后应出现语法错误“类型”或“类型”