如果值包含来自另一个 table 的关键字,则输出 true/false
Output true/false if value includes a keyword from another table
我想输出一个列,指示 offers.heading
中的值是否包含来自 keyword.keyword
的关键字。
Table 优惠
| heading |
| -------- |
| first one should be true
| second one should be false
Table 关键词
| keyword |
| --------|
| first |
| true |
结果:
| heading | keyword |
| -------- | -------------- |
| first one should be true | true |
| second one should be false | false |
我能想到的最好的方法是使用 join,但这会输出多个匹配项,而不是 true/false 格式
SELECT
offers.heading,
match.keyword
FROM offers
INNER JOIN (
SELECT keyword
FROM keyword
) AS match(keyword) ON offers.heading LIKE '%' || match.keyword || '%'
| heading | keyword |
| -------- | -------------- |
| first one should be true | true |
| first one should be true | first |
| second one should be false | null |
我们可以尝试在 SELECT
中使用 EXISTS
而不是 JOIN
因为 first one should be true
可能匹配不止一行
SELECT
o.heading,
EXISTS(SELECT 1 FROM keyword k WHERE o.heading LIKE '%' || k.keyword || '%')
FROM offers o
如果你想获得 True
或 False
字符串值,我们可以使用 CASE WHEN
表达式。
SELECT
o.heading,
(CASE WHEN EXISTS(SELECT 1 FROM keyword k WHERE o.heading LIKE '%' || k.keyword || '%') THEN 'True' ELSE 'False' END) keyword
FROM offers o
使用类似正则表达式的 ~
更容易加入。
我们可以使用断言 keyword is not null
which returns t
rue or f
alse。 Distinct
避免每个标题超过一行。
create table headings (heading varchar(285));
insert into headings values('first one should be true'),('second one should be false'),('third one no match');
create table keywords(keyword varchar(10));
insert into keywords values('first'),('true');
select
create table headings (heading varchar(285));
insert into headings values('first one should be true'),('second one should be false'),('third one no match');
create table keywords(keyword varchar(10));
insert into keywords values('first'),('true');
select distinct
heading,
keyword is not null keyword
from headings
left join keywords
on heading ~ keyword
;
heading | keyword
:------------------------- | :------
first one should be true | t
second one should be false | f
third one no match | f
db<>fiddle here
我想输出一个列,指示 offers.heading
中的值是否包含来自 keyword.keyword
的关键字。
Table 优惠
| heading |
| -------- |
| first one should be true
| second one should be false
Table 关键词
| keyword |
| --------|
| first |
| true |
结果:
| heading | keyword |
| -------- | -------------- |
| first one should be true | true |
| second one should be false | false |
我能想到的最好的方法是使用 join,但这会输出多个匹配项,而不是 true/false 格式
SELECT
offers.heading,
match.keyword
FROM offers
INNER JOIN (
SELECT keyword
FROM keyword
) AS match(keyword) ON offers.heading LIKE '%' || match.keyword || '%'
| heading | keyword |
| -------- | -------------- |
| first one should be true | true |
| first one should be true | first |
| second one should be false | null |
我们可以尝试在 SELECT
中使用 EXISTS
而不是 JOIN
因为 first one should be true
SELECT
o.heading,
EXISTS(SELECT 1 FROM keyword k WHERE o.heading LIKE '%' || k.keyword || '%')
FROM offers o
如果你想获得 True
或 False
字符串值,我们可以使用 CASE WHEN
表达式。
SELECT
o.heading,
(CASE WHEN EXISTS(SELECT 1 FROM keyword k WHERE o.heading LIKE '%' || k.keyword || '%') THEN 'True' ELSE 'False' END) keyword
FROM offers o
使用类似正则表达式的 ~
更容易加入。
我们可以使用断言 keyword is not null
which returns t
rue or f
alse。 Distinct
避免每个标题超过一行。
create table headings (heading varchar(285)); insert into headings values('first one should be true'),('second one should be false'),('third one no match'); create table keywords(keyword varchar(10)); insert into keywords values('first'),('true'); select
create table headings (heading varchar(285)); insert into headings values('first one should be true'),('second one should be false'),('third one no match'); create table keywords(keyword varchar(10)); insert into keywords values('first'),('true');
select distinct heading, keyword is not null keyword from headings left join keywords on heading ~ keyword ;
heading | keyword :------------------------- | :------ first one should be true | t second one should be false | f third one no match | f
db<>fiddle here