带有字符串列的 SQL 之间的子句
Posted
技术标签:
【中文标题】带有字符串列的 SQL 之间的子句【英文标题】:SQL Between clause with strings columns 【发布时间】:2011-08-24 06:13:21 【问题描述】:我想在字符串列上使用“between”子句进行搜索。做一些测试我得到了这个:
让我们假设有一个国家表,其“名称”列的类型为 varchar。如果我执行这个查询:
Select * from country where name between 'a' and 'b'
我得到了这个结果:
Argentina
.
.
.
Argelia.
不包括那些我觉得有点奇怪的以 B 开头的国家。
有没有办法以更准确的方式进行此搜索?进行此搜索的任何其他想法?
提前致谢
【问题讨论】:
【参考方案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
使用表索引,因此您将获得完整的性能。
【讨论】:
哦!好吧,您在理解的部分是正确的(以及整个答案)。谢谢 其实“x between 'a' and 'b'”等价于“x>='a' and x 不是这样...select 1 between 0 and 1; // true
RE "like uses the table indices":这不适用于旧版本的 Postgres。我认为是在 8.0 中,他们开始使用带有点赞的索引。因此,如果您有旧版本,这可能是一个问题。当然“之间”和“>”和“
@Richard Umm,我想你把变量名弄混了。你是从哪里来的?并且“'a'和'b'之间的x”意味着a> = x?我认为您的意思是 x>='a'。等等。【参考方案2】:
另一个查询以 b 和 A 开头的国家是:
Select * from country where name between 'a' and 'c'
【讨论】:
虽然如果您有一个名为“c”的国家/地区,它会通过该测试。在这个例子中可能不相关——我很确定世界上没有一个国家被简单地命名为“C”——但可能会出现在其他例子中。【参考方案3】:表达式
name between 'A' and 'B'
等价于
name>='A' and name<='B'
所以 'Argentina' 是 >='A' 和 'B'。它不只是查看第一个字母:它查看整个字符串。这肯定是它应该的样子:如果它不这样做,就没有办法说你想要一个包含“Smith”但不包含“Smithers”的范围。
要完成你想要的,你可以说:
substr(name,1,1) between 'A' and 'B'
或:
name like 'A%' or name like 'B%'
或:
name>='A' and name<'C'
【讨论】:
【参考方案4】:Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';
【讨论】:
【参考方案5】:我想我知道如何解决您的问题。你可以尝试像这样在后面添加额外的字符
select * from tablea where column1 between 'ABC' and 'ACD'+'Z'
这会将结果从 ABC% 返回到 ACE
【讨论】:
【参考方案6】:此语句不起作用的原因是 SQL 用空格填充字符串,直到它与比较字符串的长度相同。因此,相比之下,sql 将b
后跟几个空格与b******
进行了比较。因为空格出现在所有其他字母之前,所以 sql 决定 b*****
在 b[6 spaces]
之后。所以它不应该显示。
【讨论】:
在这种情况下,空格的差异不是问题。以上是关于带有字符串列的 SQL 之间的子句的主要内容,如果未能解决你的问题,请参考以下文章