带有字符串列的 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。)

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

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 之间的子句的主要内容,如果未能解决你的问题,请参考以下文章

JPA - 带有in子句和不区分大小写的规范

计算字符串列之间的相关性

仅对带有 Pandas 的字符串列应用转换,忽略数字数据

SQL按多值字符串列中的不同值分组

如何查找和替换字符串列中数字之间的空格?

如何检查 SQL Server 2008 表中字符串列中的 id