运算符之间如何解释字符值? (SQL)
Posted
技术标签:
【中文标题】运算符之间如何解释字符值? (SQL)【英文标题】:How are character values interpreted by between operators? (SQL) 【发布时间】:2019-11-22 10:24:25 【问题描述】:我在 SQL 中有一个代码,它通过了
'2:00' between '10:00' and '22:00'
但失败了
'02:00' between '10:00' and '22:00'
谁能帮我理解运算符之间如何解释字符串值以及上述给定场景是如何发生的?
【问题讨论】:
输入和预期输出? 以上是时代吗?如果是这样,你真的应该使用time
数据类型而不是依赖字符串“ordering”
是的,我最终将它投射到时间,但仍然对它如何与字符串一起使用感到好奇
【参考方案1】:
在您的第一个 BETWEEN
子句中,错误地传递:
'2:00' between '10:00' and '22:00'
这些值按字典顺序排序为文本,而不是数字。在这里它们按文本排序:
10:00
2:00
22:00
文本22
比2:
“大”,因此检查通过。这里的解决方案是将时间作为数字进行比较,或者始终确保时间具有相同的宽度。假设您的数据看起来像第一种情况,您可以尝试在 SQL Server 中转换为时间:
SELECT *
FROM yourTable
WHERE CAST('2:00' AS time) BETWEEN '10:00' AND '22:00';
如预期的那样,上述查询将失败,因为您现在正在将一个正确的时间文字与一系列正确的时间文字进行比较。
【讨论】:
但是SELECT CASE WHEN '2:00' between '10:00' and '22:00' THEN 1 ELSE 0 END
返回 1
而不是 0
。
@Larnu 现在在手机上,昨晚睡了 3 个小时,熬夜看新生儿(同时还回答了 Stack Overflow 问题)。
检查我的答案末尾的查询,该查询因演员阵容而失败,但没有演员就通过了。
啊,我明白了,我错过了阅读你的逻辑,抱歉。认为是最初的订单让我感到震惊;你确实是对的。
@TimBiegeleisen 使用字典顺序排序规则(例如 Latin1_General_CI_AS
),SQL Server 比较我提到的:SELECT '>' WHERE '2' COLLATE Latin1_General_CI_AS > ':' COLLATE Latin1_General_CI_AS;
。虽然不常用,但二进制排序规则将使用代码点:SELECT '<' WHERE '2' COLLATE Latin1_General_BIN > ':' COLLATE Latin1_General_BIN;
以上是关于运算符之间如何解释字符值? (SQL)的主要内容,如果未能解决你的问题,请参考以下文章