如何按字段过滤包含另一个字段

时间:2019-08-18 10:25:13

标签: sql sql-server

我有一个表,其中包含“内容”字段和“国家”字段。 我需要检查国家名称是否出现在文本内容中。

内容:

  • “法国法式长棍面包”
  • “החומוסהטובביותרהואבישראל”
  • “迈克尔·菲尔普斯(Michael Phelps)在美国获得最后的金牌 团队赢得了4×100米混合泳接力赛。“

国家/地区:

  • 法国
  • ישראל
  • 美国

使用like子句似乎是正确的选择,但我不知道如何使用国家/地区字段中的值进行此类检查。

4 个答案:

答案 0 :(得分:1)

使用字典表的简单方法:

CREATE TABLE country(id INT, name NVARCHAR(100));
INSERT INTO country(id, name) VALUES (1, 'United States'), (2, 'France'), (3, N'ישראל');

SELECT *
FROM mytable m
JOIN country c
  ON m.content LIKE '%' + c.name + '%';

当然,这不是防弹解决方案,因为根据语言和名词的大小写,国家可能会有所不同。

编辑:

如果国家/地区位于同一行:

SELECT *,
    CASE WHEN m.content  LIKE '%' + m.country + '%' THEN 'Present' ELSE 'None' END
FROM mytable m

答案 1 :(得分:0)

由于您只需要检查其他表中的数据,您可以只具有一个子查询,或者根据您的数据逐行进行操作,而无需像这样的子查询

    SELECT Case
    when Content Like '%'+country+'%' 
     then "Yes" else "No" end, content, 
     country from table ; 

或通过子查询

   SELECT 
     content, 
     country from table where content IN 
      (Select '%'+country+'%' from table ) 
       ; 

答案 2 :(得分:0)

我想你想要

where Content like N'%' + country + N'%' 

这将返回所在国家/地区所在的行。您似乎有多个字符集,所以我认为nvarchar()是合适的。

答案 3 :(得分:-1)

使用PostgreSQL的答案。 我使用了position函数,但其​​他数据库也有类似的函数(例如,对于Oracle来说为instr)。

select * from $table_name$ a
where position(country in content) > 0;