SQLite多字段使用LIKE做文本搜索时如何处理NULL值问题
错误原因
你尝试的写法语法不合法:LIKE 运算符必须明确指定左侧匹配的字段,不能省略,所以(id IS NOT NULL AND LIKE '%teacher%')这类写法本身就会触发语法报错。
解决方案
你可以选择两种实现方式,效果完全一致:
方式1:显式判断每个字段非NULL后匹配
直接修正你原来的写法,补全每个LIKE左侧的字段名即可:
SELECT * FROM `posts` WHERE (id IS NOT NULL AND id LIKE '%teacher%') OR (author IS NOT NULL AND author LIKE '%teacher%') OR (title IS NOT NULL AND title LIKE '%teacher%') OR (selftext IS NOT NULL AND selftext LIKE '%teacher%') OR (url IS NOT NULL AND url LIKE '%teacher%') OR (media IS NOT NULL AND media LIKE '%teacher%') OR (comments IS NOT NULL AND comments LIKE '%teacher%');
方式2:用COALESCE简化写法
通过COALESCE函数把NULL值替换为空字符串,不需要单独判断非NULL,代码更简洁:
SELECT * FROM `posts` WHERE CONCAT( COALESCE(id, ''), COALESCE(author, ''), COALESCE(title, ''), COALESCE(selftext, ''), COALESCE(url, ''), COALESCE(media, ''), COALESCE(comments, '') ) LIKE '%teacher%';
说明:
COALESCE的作用是返回参数列表中第一个非NULL的值,这里把所有NULL列替换为空字符串,不会影响匹配结果,也避免了拼接时因某列为NULL导致整体结果为NULL的问题。如果你用的数据库支持IFNULL,也可以替代COALESCE使用,效果相同。
内容的提问来源于stack exchange,提问作者Redark
相关产品推荐
相关产品推荐

