我想在字符串列上使用“between”子句进行搜索。做一些测试我得到了这个:
假设有一个国家/地区表,其中包含varchar类型的“name”列。如果我执行此查询:
Select * from country where name between 'a' and 'b'
我得到了这个结果:
Argentina
.
.
.
Argelia.
它排除那些以B开头的国家,我发现它有点奇怪。
有没有办法以更准确的方式进行搜索?有什么其他想法可以进行此搜索吗?
提前致谢
答案 0 :(得分:36)
表达式
name between 'A' and 'B'
相当于
name>='A' and name<='B'
所以'阿根廷'是&gt; ='A'和&lt; ='B'并且它满足条件。但'玻利维亚'不是&lt; ='B'。 '玻利维亚' &GT; 'B'。它不只是看第一个字母:它查看整个字符串。这肯定是应该的方式:如果它不这样做,就没有办法说你想要一个包括'史密斯'而不是'史密瑟斯'的范围。
要完成你想要的,你可以说:
substr(name,1,1) between 'A' and 'B'
或:
name like 'A%' or name like 'B%'
或:
name>='A' and name<'C'
答案 1 :(得分:2)
我想我知道如何解决你的问题。你可以尝试像这样在后面添加额外的角色
select * from tablea where column1 between 'ABC' and 'ACD'+'Z'
这会将ABC%的结果返回给ACE
答案 2 :(得分:1)
结果准确,但您可能会误解。 x between a and b
表示x>=a and x<=b
。 (有关详细信息,请参阅PostGRES documentation。)
如果您想获得以a
或b
开头的行,请说明您的意思:
select * from country where name like 'a%' or name like 'b%'
like
使用表索引,因此您将获得使用它的完整性能。
答案 3 :(得分:1)
另一个以b和A开头的国家的查询将是:
Select * from country where name between 'a' and 'c'
答案 4 :(得分:0)
Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';
答案 5 :(得分:-1)
此语句不起作用的原因是SQL使用空格填充字符串,直到它与比较字符串的长度相同。因此,相比之下,sql比较b
,然后是b******
的几个空格。因为空格出现在所有其他字母之前,所以sql决定b*****
在b[6 spaces]
之后出现。所以它不应该显示。