如果值包含来自另一个 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

如果你想获得 TrueFalse 字符串值,我们可以使用 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

sqlfiddle

使用类似正则表达式的 ~ 更容易加入。 我们可以使用断言 keyword is not null which returns true or false。 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