这是一个表结构:表名 - UTEF_P
id location name
1 Place A AA/1
2 Place Z AA/2
3 Place T AA/3
4 Place Y AA/4
5 Place T AA/5
6 Place I AA/6
7 Place U AA/7
8 Place J AA/8
9 Place H AA/9
10 Place O AA/10
现在,如果我运行此查询: - Select * from UTEF_P where name >= 'AA/1' and name <= 'AA/10'
,它只返回2条记录而不是10条记录。
那么,有没有解决方案?
答案 0 :(得分:2)
这是正确的,字母顺序在数字上并不是特别直观。
我的建议是只包括所有可能的值:
Select *
from UTEF_P
where name IN ('AA/1', 'AA/2', 'AA/3', 'AA/4', 'AA/5',
'AA/6', 'AA/7', 'AA/8', 'AA/9', 'AA/10');
这样可以将查询编入索引。或者,您可以提取子字符串并转换为数字,但性能可能不太好:
Select *
from UTEF_P
where substr(name from 1 for 3) = 'AA/'
and cast(substr(name from 4) as decimal) between 1 and 10;
最后但同样重要的是,在文本列中进行此类数字搜索的需求可能是数据未以最佳格式存储的症状。
答案 1 :(得分:1)
您没有遵循基本概念,>=
或<=
只能与数值一起使用。由于您正在处理的值为string
,因此,由于=
部分为>
,您获得的结果为两个。 <{1}}与两个字符串匹配,即仅返回两个结果。
而是尝试REGEXP:
=
答案 2 :(得分:0)
您可以拆分mysql列值,然后检查值
Select * from UTEF_P where SUBSTRING_INDEX(name,'/',-1) BETWEEN 1 AND 10;
我想你可以用各自语言的相应参数分割1和10。
如果你想匹配AA,那么使用
Select * from UTEF_P where SUBSTRING_INDEX(name,'/',-1) BETWEEN 1 AND 10 AND name LIKE 'AA%' ;
答案 3 :(得分:0)
如果我想过滤名称&gt;这可能会有效AA / 1:
select * from UTEF_P where left(name,2) > 'AA' and substr(name,locate("/", name)+1) > '1';
答案 4 :(得分:0)
您的范围搜索(>=
)现在位于字符串范围内,因此它会根据字母顺序:'AA/10' < 'AA/9'
来比较字符串。
尝试投射:
Select *
from UTEF_P
where cast(mid(name,3),INT) BETWEEN 1 AND 10