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.name
和 writers.id
中搜索文本-关联 papers.title
.
例如,如果我搜索“是”,我会得到两个:
- Alex Crisp(对于 'is' 中的名字 'Crisp')
- Andy Seaside(因为Andy写了一篇
paper
,标题'is''Cisco')
“是”搜索的输出:
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。
从
我们学习的子查询 :
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.name
和 writers.id
中搜索文本-关联 papers.title
.
例如,如果我搜索“是”,我会得到两个:
- Alex Crisp(对于 'is' 中的名字 'Crisp')
- Andy Seaside(因为Andy写了一篇
paper
,标题'is''Cisco')
“是”搜索的输出:
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。