如何用SQL查询全表数据并标记含指定字符串的行?
实现全表查询并标记包含指定字符串的行
需要查询表中所有行,同时新增containsString字段(1表示title包含“foo”,0表示不包含),替代先查全表再用程序处理的方案。当前尝试的SQL仅返回匹配行,无法满足需求。
示例原表
| id | title |
|---|---|
| 1 | foo |
| 2 | bar |
| 3 | foobar |
| 4 | moo |
| 5 | cow |
期望结果表
| id | title | containsString |
|---|---|---|
| 1 | foo | 1 |
| 2 | bar | 0 |
| 3 | foobar | 1 |
| 4 | moo | 0 |
| 5 | cow | 0 |
错误的尝试SQL
SELECT t1.id, t1.title, t2.id as containsString FROM `news` t1, `news` t2 where t1.id = t2.id LEFT JOIN news t2 ON WHERE t2.title LIKE '%foo%'
正确SQL实现
不需要关联表,直接用条件判断函数即可,主流数据库的实现如下:
MySQL/MariaDB
可以用IF函数或CASE语句:
SELECT id, title, IF(title LIKE '%foo%', 1, 0) AS containsString FROM news;
或者:
SELECT id, title, CASE WHEN title LIKE '%foo%' THEN 1 ELSE 0 END AS containsString FROM news;
PostgreSQL
使用CASE语句或BOOL_TO_INT函数:
SELECT id, title, CASE WHEN title LIKE '%foo%' THEN 1 ELSE 0 END AS containsString FROM news; -- 简化写法 SELECT id, title, BOOL_TO_INT(title LIKE '%foo%') AS containsString FROM news;
SQL Server
用CASE语句实现:
SELECT id, title, CASE WHEN title LIKE '%foo%' THEN 1 ELSE 0 END AS containsString FROM news;
以上语句会返回表中所有行,通过条件判断title是否包含“foo”动态生成containsString字段值,无需额外关联表,性能更优。
内容的提问来源于stack exchange,提问作者RayJ_inSJ
相关产品推荐
相关产品推荐

