使用 between 语句查询包含数字的 SQL 列 varchar6
Posted
技术标签:
【中文标题】使用 between 语句查询包含数字的 SQL 列 varchar6【英文标题】:Querying SQL column varchar6 containing numbers with a between statement 【发布时间】:2020-05-21 03:58:57 【问题描述】:该表有一个类型为 varchar6 的列,其中包含 000000 到 999999 之间的 6 个数字,或者为空。 无论您为此列 SEQ 的各种变量提供什么值,它都不会返回任何结果,但不会出现语法错误。 我怀疑如果你用两个 varchar6 做一个 between,你在 SQL 中找不到任何东西。
sql查询是;
select Top 2000 A.*
from TABLE1 A
where A.SEQ between '0' and '999999'
这感觉像是一个设计缺陷,因为存储和比较数字可能不应该使用 varchar6,但不幸的是,改变表格的设计是不可能的。
如何更改此 SQL 以便正确比较?
【问题讨论】:
在 varchar 字段之间比较 ASCII 字符而不是数字。即,12 介于 1 和 2 之间。您可以将它们转换为整数吗? 喜欢这个?从 TABLE1 A 中选择前 2000 个 A.*,其中 (int,A.SEQUENCE_NO) 在 '1' 和 '999999' 之间 @Kuei。 . .您的代码应该可以工作。还有其他问题,例如您看不到的主角。 【参考方案1】:您的代码应该可以工作。我怀疑你的数据有问题。您可以检查:
select A.*
from TABLE1 A
where try_convert(int, A.SEQ) is null and A.SEQ is not null;
或者:
select A.*
from TABLE1 A
where A.seq like '%[^0-9]%';
当您发现数据存在问题时,您可以解决问题。您还将了解为什么不应将数字存储在字符串中。
【讨论】:
我认为第二个示例的正则表达式中有错字。如果目的是查找包含非数字字符的字符串,它目前只查找不以数字开头的字符串。例如。它匹配“A12”但不匹配“1AB”。它需要是 '%[^0-9]%' 以匹配字符串中任何位置的非数字。 @WileCau 。 . .我想你是正确的。我更新了答案。 是的,事实证明数据中有随机空格,因此“00”没有正确匹配。感谢您提供正则表达式的想法。【参考方案2】:你说字符串是 VARCHAR(6),你想选择 0-999999 之间的任何东西,所以这似乎是任何数字。
您可以像这样选择数值:
SELECT TOP 2000 *
FROM TABLE1
WHERE ISNUMERIC(SEQ) = 1
或者,如果您知道只有数字字符串和空格(我假设空格是指 NULL 或 ''),您可以像这样选择非空格:
SELECT TOP 2000 *
FROM TABLE1
WHERE SEQ IS NOT NULL AND SEQ <> ''
【讨论】:
你的第一个建议就是我要找的,谢谢!以上是关于使用 between 语句查询包含数字的 SQL 列 varchar6的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 数据查询语句中between and 是包含边界值的