使用 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 是包含边界值的

sql 语句问题,关于BETWEEN AND 和DATE 的

SQL语句怎样查询一个范围

SQL语句中 between and

sql语句判断是否为数字字母中文

SQL SELECT、CASE、BETWEEN INTO 语句