查询所有行,并指示哪些行在列中具有特定文本

query for all rows and indicate which ones have a certain text in a column

提问人:RayJ_inSJ 提问时间:5/11/2023 最后编辑:RayJ_inSJ 更新时间:5/11/2023 访问量:39

问:

我正在尝试查询表以获取所有行,但也返回与字符串搜索匹配的行。

例如,下表如下所示。

编号 标题
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%'
SQL 的MySQL

评论


答:

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
虽然答案会给你带来相同的结果,但性能也需要检查。此查询将需要对整个数据进行两次顺序扫描,而将在单次扫描中完成。UNIONcase-when