【问题标题】:Get words from sentence - SQL从句子中获取单词 - SQL
【发布时间】:2010-08-10 14:25:52
【问题描述】:

假设我有一个包含

的描述列
Column Description
------------------
I live in USA
I work as engineer 

我还有一个包含国家列表的表格,因为第一行提到了美国(国家名称),所以我需要那一行。

在第二种情况下,没有国家名称,所以我不需要该列。

你能解释一下吗

【问题讨论】:

  • “在第二种情况下,没有国家名称,所以我不需要该列”——您真的要选择列吗?
  • “I AM USAIN BOLT”这个短语应该那个与美国国家匹配吗?
  • @onedaywhen:Yousa 对!binks>

标签: sql


【解决方案1】:

您可能想尝试以下方法:

SELECT   cd.* 
FROM     column_description cd
JOIN     countries c ON (INSTR(cd.description, c.country_name) > 1);

如果您使用的是 SQL Server,您应该能够使用 CHARINDEX() 函数而不是 INSTR(),后者可用于 MySQL 和 Oracle。您也可以按照其他答案的建议使用LIKE

测试用例:

CREATE TABLE column_description (description varchar(100));
CREATE TABLE countries (country_name varchar(100));

INSERT INTO column_description VALUES ('I live in USA');
INSERT INTO column_description VALUES ('I work as engineer');

INSERT INTO countries VALUES ('USA');

结果:

+---------------+
| description   |
+---------------+
| I live in USA |
+---------------+
1 row in set (0.01 sec)

【讨论】:

  • @OMG:你认为LIKE在这种情况下更好吗?
  • 在不知道所涉及的数据库的情况下,LIKE 更加一致和可用。
【解决方案2】:

这是一个非常糟糕的主意,加入这样的任意文本。它会很慢,甚至可能不起作用..试一试:

select t1.description, c.*
from myTable t1
left join countries c on t1.description like CONCAT('%',c.countryCode,'%')

【讨论】:

  • +1:打败我;如果我们知道数据库(或 Sphinx 和 Solr 等第 3 方),则可以使用全文搜索
【解决方案3】:

从您的帖子中并不清楚,但我认为您要求返回表中包含包含某个国家/地区名称的描述的所有行?如果是这种情况,您可以像下面这样使用 sql LIKE 运算符。

select
 column_description
from
 description_table
where
 column_description like %(select distinct country_name from country)%

如果不是,我认为您唯一的选择是 Dans post。

享受吧!

【讨论】:

  • 好吧,运营商很好,但我不想硬编码国家名称,我这里有 100 个国家名称,明天可能会添加一些新国家,我必须在这里再次硬编码....感谢您的回答....
  • 您可以通过插入嵌套选择轻松实现动态化——我已经更新了帖子。谢谢!
【解决方案4】:

到目前为止,所有建议似乎都与部分单词匹配,例如'I AM USAIN BOLT' 将匹配国家 'USA'。这个问题意味着应该对整个单词进行匹配。

如果文本完全由字母数字字符组成,并且每个单词由空格字符分隔,您可以使用类似这样的内容

Descriptions AS D1
LEFT OUTER JOIN Countries AS C1
   ON ' ' + D1.description + ' '
      LIKE '%' + ' ' + country_name + ' ' + '%'

但是,“句子”意味着标点符号,例如以上内容与“我在美国、果阿和伊朗工作”不匹配。您需要先对单词进行定界,然后才能开始匹配它们。令人高兴的是,这个问题已经有了解决方案,例如SQL Server 等中的全文搜索。为什么要重新发明轮子?

另一个问题是一个国家可以有很多名字,例如。我的国家可以合法地被称为“英国”、“英国”、“GB”(根据我的 stackoverflow 个人资料)、“英格兰”(如果你问我的孩子)和“大不列颠及北爱尔兰联合王国”(后者是我护照上的内容,不,它不适合您的NVARCHAR(50) 列;)仅举几例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多