PostgreSQL LIKE语句无法正常执行问题排查求助
排查PostgreSQL LIKE语句在视图中失效的问题
嘿,我来帮你搞定这个头疼的问题!你创建视图时用LIKE '%python%'没返回结果,但去掉这个条件就有数据,大概率是以下几个常见原因,咱们一个个排查:
1. 大小写敏感是最常见的坑
PostgreSQL默认的LIKE操作是大小写敏感的!如果你的书标题里是Python Crash Course、PYTHON for Beginners这种带大写字母的,%python%根本匹配不到。
解决办法很简单,二选一就行:
- 用
ILIKE代替LIKE,它会忽略大小写:CREATE VIEW sole_python_author(author_first_name, author_last_name,book_title) AS SELECT authors.first_name,authors.last_name, books.title FROM authors, books WHERE books.author_id = authors.author_id AND books.title ILIKE '%python%'; - 或者把标题转成小写再匹配:
CREATE VIEW sole_python_author(author_first_name, author_last_name,book_title) AS SELECT authors.first_name,authors.last_name, books.title FROM authors, books WHERE books.author_id = authors.author_id AND LOWER(books.title) LIKE '%python%';
2. 数据里藏着看不见的特殊字符
有时候标题里可能有空格、换行符、制表符或者其他不可见字符,看起来像是包含python,但实际匹配不上。你可以先直接查询数据排查:
-- 查看所有标题的原始字符长度,对比正常标题 SELECT title, octet_length(title) AS char_length FROM books WHERE author_id IN (SELECT author_id FROM authors);
如果某条记录的char_length明显比视觉上的长度长,那大概率是有隐藏字符。可以用TRIM()函数清理后再匹配:
AND TRIM(books.title) ILIKE '%python%';
3. 字符编码不匹配
如果你的数据库和插入的数据编码不一致,也可能导致匹配失败。先检查数据库和表的编码:
-- 查看数据库编码 SHOW server_encoding; -- 查看books表的编码 SELECT pg_encoding_to_char(relencoding) FROM pg_class WHERE relname = 'books';
确保两者编码一致,比如都是UTF8,如果不一致可能需要重新导入数据或者修改表编码。
4. 先直接运行SELECT语句验证
你可以先跳过创建视图,直接运行查询语句看看有没有结果:
SELECT authors.first_name, authors.last_name, books.title FROM authors, books WHERE books.author_id = authors.author_id AND books.title LIKE '%python%';
如果这个语句本身就没结果,那说明你的数据里确实没有标题包含小写python的书;如果有结果,那再检查视图的创建权限(不过这种情况很少见,一般权限不够会直接报错)。
先试试上面的方法,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Dreeww
相关产品推荐
相关产品推荐

