字符串大于或小于

7

我有以下数据:

[sequences]
/a1
/a2
/a3
...
/a10

查询SELECT * FROM sequences WHERE nbr <= '/a10'应该返回上面的列表,但实际上返回了以下内容:

[results]
/a1
/a10

如何使其返回上述列表中的所有行?

3
我会从字符串中删除“a”,将其转换为数字,然后进行比较。 - bevacqua
3
你使用的是哪种 SQL 版本? - tofutim
这是哪个SQL服务器?这个问题的答案取决于具体实现。 - Martijn Pieters
需要提供更多关于数据可能的样子的信息,但下面的实现还不错。 - tofutim
2个回答

7

它按照预期工作。要比较数值,您需要以某种方式将它们转换为数字。一个好的开始是使用substr(yourfieldname, 3)来截取/a。然后您可以使用convert`将其强制转换为int类型,因此您的最终查询将类似于:

select * from sequences where convert(int, substr(nbr, 3)) <= 10

请注意,将字符串转换为整数的确切功能和规则可能因DBMS而异。尽管如此,这说明了一般思路。

1
但请记住,这个查询将不再能够使用索引。 - user149341
此外,你最好确保格式不会改变 - 比如,abe4291032 可能会使你出现错误。 - tofutim
@duskwuff和@tofutim都提出了很好的观点。如果你真的需要使用数字进行索引和搜索,最好将该值的数字表示存储在单独的列中。你甚至可以在触发器中自动完成这个步骤,这样你就能够实现更智能的解决方案来提取数字,并且你只需要在一个地方管理该功能。 - GolezTrol
由于@mwok没有告诉我们DBMS,因此这可能不适用,但是在Oracle中的虚拟列甚至可以消除触发器的需要。 - eaolson

2
SELECT *
FROM sequences 
WHERE toInt(substring (nbr, 2)) <= 10;

'substring'函数和'toInt'函数的名称和语法因数据库实现而异。


那里的 'AS' 是做什么的? - GolezTrol
抱歉 - 这是之前测试遗留下来的。我已经将其删除了。 - user unknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接