Sql 了解ORACLE';S在关键字之间

Sql 了解ORACLE';S在关键字之间,sql,oracle,Sql,Oracle,我正在帮助一位同事调试一个返回奇怪结果的查询。我们把它缩小成这样一条线: 其中COL介于'11201'和'111226'之间 COL中的值来自对substring的调用,因此它是字符串类型的值。这不会返回任何结果 天真地说,我一直认为在>=和之间表示表达式: WHERE COL BETWEEN '11201' AND '111226' 同: WHERE COL >= '11201' AND COL <= '111226' 显然,这些值之间没有字母顺序,因为'BBC'出现在'BBB

我正在帮助一位同事调试一个返回奇怪结果的查询。我们把它缩小成这样一条线:

其中COL介于'11201'和'111226'之间

COL中的值来自对substring的调用,因此它是字符串类型的值。这不会返回任何结果

天真地说,我一直认为在>=和之间表示表达式:

WHERE COL BETWEEN '11201' AND '111226'
同:

WHERE COL >= '11201' AND COL <= '111226'
显然,这些值之间没有字母顺序,因为
'BBC'
出现在
'BBB'
之后

道德?如果希望比较直观,请使用正确的类型。

表达式:

WHERE COL BETWEEN '11201' AND '111226'
同:

WHERE COL >= '11201' AND COL <= '111226'
显然,这些值之间没有字母顺序,因为
'BBC'
出现在
'BBB'
之后


道德?如果您想要直观的比较,请使用正确的类型。

在下面的表达式中

WHERE COL BETWEEN '11201' AND '111226'
您正在将文本列
COL
与文本进行比较。字符串
'11201'
在词典学上大于字符串
'111226'
。换句话说,在字典中,
'11201'
位于
'111226'
之后,或者前者大于后者。这就是没有结果的原因。但是,如果将
COL
强制转换为一个数字,并将其与数字进行比较,则假设存在匹配的记录,则比较可能有效:

WHERE TO_NUMBER(COL) BETWEEN 11201 AND 111226

在下面的表达式中

WHERE COL BETWEEN '11201' AND '111226'
您正在将文本列
COL
与文本进行比较。字符串
'11201'
在词典学上大于字符串
'111226'
。换句话说,在字典中,
'11201'
位于
'111226'
之后,或者前者大于后者。这就是没有结果的原因。但是,如果将
COL
强制转换为一个数字,并将其与数字进行比较,则假设存在匹配的记录,则比较可能有效:

WHERE TO_NUMBER(COL) BETWEEN 11201 AND 111226

col
是一个字符串,您将两个字符串传递到
之间的
。我不知道为什么你会希望它可以播放,但是,正如你所注意到的,它不会播放。@Donnie是的,我真的不知道为什么我会认为它会播放-回想起来似乎很愚蠢。
col
是一个字符串,你正在将两个字符串传递到
之间的
。我不知道你为什么会期待这个角色,但是,正如你所注意到的,它没有。@Donnie是的,我真的不知道为什么我会假设它会出现-回想起来似乎很愚蠢。这与我在测试它后在问题的下半部分所假设的相符,所以我将把它标记为公认的答案。@Joe-“道德”在戈登回答的最后,它的价值超过了它的黄金重量。这意味着不是“将COL封装到_编号中”。相反,它的真正含义是“使列成为数字数据类型的列”。原因有很多。例如,如果您在COL上有一个索引,并且您的意思是COL是数字的,但您将其声明为字符串,那么您将无法使用该索引-因此应该几乎是即时的查询可能会运行几分钟。错误的数据类型可能是Oracle(以及一般的编程)中最常见的滥用。这与我在测试后在问题的下半部分所假设的相符,因此我将此标记为公认的答案。@Joe-Gordon回答末尾的“道德”比它的黄金价值更高。这意味着不是“将COL封装到_编号中”。相反,它的真正含义是“使列成为数字数据类型的列”。原因有很多。例如,如果您在COL上有一个索引,并且您的意思是COL是数字的,但您将其声明为字符串,那么您将无法使用该索引-因此应该几乎是即时的查询可能会运行几分钟。错误的数据类型可能是Oracle(以及一般编程)中最常见的滥用。