SQL Between子句与字符串列

时间:2011-05-12 15:51:42

标签: sql database postgresql search

我想在字符串列上使用“between”子句进行搜索。做一些测试我得到了这个:

假设有一个国家/地区表,其中包含varchar类型的“name”列。如果我执行此查询:

Select * from country where name between 'a' and 'b'

我得到了这个结果:

Argentina
.
.
.
Argelia.

它排除那些以B开头的国家,我发现它有点奇怪。

有没有办法以更准确的方式进行搜索?有什么其他想法可以进行此搜索吗?

提前致谢

6 个答案:

答案 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。)

如果您想获得以ab开头的行,请说明您的意思:

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]之后出现。所以它不应该显示。