提问人:RayJ_inSJ 提问时间:5/11/2023 最后编辑:RayJ_inSJ 更新时间:5/11/2023 访问量:39
查询所有行,并指示哪些行在列中具有特定文本
query for all rows and indicate which ones have a certain text in a column
问:
我正在尝试查询表以获取所有行,但也返回与字符串搜索匹配的行。
例如,下表如下所示。
编号 | 标题 |
---|---|
1 | 傅 |
2 | 酒吧 |
3 | 福巴尔 |
4 | 哞 |
5 | 牛 |
我想查询并指出哪些包含“foo”。查询结果可能如下所示。'containsString' 可以是 0|1 或 null|id,只是指示该行包含字符串 “foo”。
编号 | 标题 | containsString |
---|---|---|
1 | 傅 | 1 |
2 | 酒吧 | 0 |
3 | 福巴尔 | 1 |
4 | 哞 | 0 |
5 | 牛 | 0 |
备份策略是查询所有结果,然后以编程方式映射它。但我希望在SQL中做到这一点。
这是我第一次尝试它,但没有奏效,因为它只返回包含“foo”的行
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%'
答:
2赞
Chetan Ahirrao
5/11/2023
#1
您可以使用以下工具:CASE WHEN
SELECT id, title,
CASE
WHEN title like '%foo%' THEN 1
ELSE 0
END as comtainsString
FROM news;
0赞
Arvin Asgharian
5/11/2023
#2
在这种情况下,Chetan 方法有效,但另一种方法是首先创建一个表,其中所有名称中都有一个 foo,并将其与其他方法合并:
select *
from
(select *, 1 as containsFoo
from table
where title like "%foo%") as T1
union
(select *, 0 as containsFoo
from table
where title not like "%foo%")
order by id;
评论
1赞
Chetan Ahirrao
5/11/2023
虽然答案会给你带来相同的结果,但性能也需要检查。此查询将需要对整个数据进行两次顺序扫描,而将在单次扫描中完成。UNION
case-when
评论