为什么 SQL 字符串相等和 Postresql 中的 LIKE 运算符的结果不同?

问题描述 投票:0回答:1

我有一个包含登录名的表。登录名不包含任何特殊字符,仅包含

[a-zA-Z0-9]
且类型为 varchar(50)。

我想通过登录名查找用户,例如:

CREATE TABLE users( login character varying(50) );
INSERT INTO users VALUES ('user1');
INSERT INTO users VALUES ('user2');

SELECT *
FROM users
WHERE ...;

login LIKE 'exactMatch'
login LIKE 'exactMatch%'
login = 'exactMatch'

有什么区别

我希望对于这个两行数据库,以下条件都会返回相同的结果:

login LIKE '%user1'
login LIKE 'user1%'
login = 'user1'
login LIKE 'user1'

在某些情况下,对于更复杂的登录名,最后两个条件会失败。

postgresql where-clause sql-like
1个回答
0
投票

首先回答一下你问的问题:

login LIKE 'exactMatch'、login LIKE 'exactMatch%' 和 login = 'exactMatch' 之间有什么区别

login LIKE 'exactMatch'
和 'login = 'exactMatch'` 是等效的。

当您将

%
_
放入字符串中时,您就会进入
LIKE
的模式匹配功能。当您拥有
login LIKE 'exactMatch%'
时,您将获得以“exactMatch”开头,后跟任意数量的字符的登录信息。

现在,我认为您最后描述的问题是您发现必须在 LIKE 子句中使用

%
才能获得您期望的匹配项。我猜这是因为您的登录名中实际上存在意外字符,或者可能是字符集问题。

您可能会通过运行查找不可打印字符并从登录中删除空格的查询来发现问题:

SELECT login FROM users
WHERE login <> trim(regexp_replace(login, '[^[:print:]]', 'x', 'g'));
© www.soinside.com 2019 - 2024. All rights reserved.