带有字符串连接的 Firebird 查询和 where 子句中的 like 不起作用
Firebird query with string concatenation and like in the where clause doesn't work
我有一个用户 table 有名字和姓氏。我想为 'clark kent' 这样的字符串查找用户。
我这样做
SELECT * FROM user WHERE fisrt_name || ' ' || last_name LIKE '%clark kent%'
但我没有任何结果。
为什么?如果我搜索 'clark' 或 'kent' 它有效。
尝试
SELECT *
FROM user
WHERE upper(fisrt_name) LIKE '%CLARK%'
and upper(last_name) LIKE '%KENT%'
解决方案:
SELECT *
FROM user
WHERE TRIM("first_name") || ' ' || TRIM("last_name") LIKE '%clark kent%';
根据 OP 的评论,困难在于 first_name
和 last_name
是 CHAR 而不是 VARCHAR 字段,这意味着字段被 space 填充到它们的长度。也就是说,存储为 CHAR(8) 的字符串 'clark'
是 'clark[sp][sp][sp]'
.
将字段连接在一起形成 "full name" 时,生成的字符串具有意外的 space:'clark[sp][sp][sp][sp]kent[sp][sp][sp][sp]'
.
(顺便说一句,在严格的 SQL 中,CHAR 列相当违反直觉。它们 比较 而不考虑 space 填充,但是LIKE 运算符不会忽略 space 填充。请参阅 Firebird FAQ。)
我有一个用户 table 有名字和姓氏。我想为 'clark kent' 这样的字符串查找用户。 我这样做
SELECT * FROM user WHERE fisrt_name || ' ' || last_name LIKE '%clark kent%'
但我没有任何结果。 为什么?如果我搜索 'clark' 或 'kent' 它有效。
尝试
SELECT *
FROM user
WHERE upper(fisrt_name) LIKE '%CLARK%'
and upper(last_name) LIKE '%KENT%'
解决方案:
SELECT *
FROM user
WHERE TRIM("first_name") || ' ' || TRIM("last_name") LIKE '%clark kent%';
根据 OP 的评论,困难在于 first_name
和 last_name
是 CHAR 而不是 VARCHAR 字段,这意味着字段被 space 填充到它们的长度。也就是说,存储为 CHAR(8) 的字符串 'clark'
是 'clark[sp][sp][sp]'
.
将字段连接在一起形成 "full name" 时,生成的字符串具有意外的 space:'clark[sp][sp][sp][sp]kent[sp][sp][sp][sp]'
.
(顺便说一句,在严格的 SQL 中,CHAR 列相当违反直觉。它们 比较 而不考虑 space 填充,但是LIKE 运算符不会忽略 space 填充。请参阅 Firebird FAQ。)