SQL 子查询作为 LIKE 搜索的一部分

SQL subquery as part of LIKE search

我们学会了使用子查询来查找信息once-removed。

我们学习的子查询 :

 SELECT * FROM papers WHERE writer_id IN ( SELECT id FROM writers WHERE boss_id = 4 );

现在,我需要在 table 的列值和另一个 table 上与 id 相关的列值中搜索 table。

这里有相同的 table,但 col 值包含更多文本供我们“搜索”参考...

writers:

id name boss_id
1 John Jonno 2
2 Bill Bosworth 2
3 Andy Seaside 4
4 Hank Little 4
5 Alex Crisp 4

writers papers 他们写...

papers:

id title writer_id
1 Boston 1
2 Chicago 4
3 Cisco 3
4 Seattle 2
5 North 5

我可以用它只搜索 writers...

上的名字

仅搜索 writers.name : (不是我想要的)

SELECT * FROM writers WHERE LOWER(name) LIKE LOWER('%is%');

上述搜索的输出:(不是我想要的)

id name boss_id
5 Alex Crisp 4

我想从 writers(而不是 papers)return cols,但同时在 writers.namewriters.id 中搜索文本-关联 papers.title.

例如,如果我搜索“是”,我会得到两个:

“是”搜索的输出

id title writer_id
2 Chicago 4
4 Seattle 2

这是我有但不起作用的东西:

SELECT * FROM papers WHERE LOWER(title) LIKE LOWER('%is%') OR writer_id ( writers=writer_id WHERE LOWER(name) LIKE LOWER('%$is%') );

既然你想要 to return cols from writers (not papers) 你应该先 select 他们,然后在标准中使用论文中的东西

select *
from writers w
where 
   w.name like '%is%'
   or 
   w.id in (select p.writer_id
            paper p
            where p.title like '%is%'
           )

您可以添加您的 LOWER 函数(我的 sql 环境不是 case-sensitive,所以我不需要它们)

表达此标准的最佳方式是使用具有 exists:

的相关查询
select *
from writers w
where Lower(w.name) like '%is%'
  or exists (
    select * from papers p
    where p.writer_id = w.id and Lower(p.title) like '%is%'
  );

请注意,您不需要在您提供的字符串上使用 lower,如果您的排序规则确实是 case-sensitive,您应该只使用 lower,因为使用该函数搜索谓词 unsargable。