从句子中获取单词 - SQL

时间:2010-08-10 14:25:53

标签: sql

假设我有一个包含

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

我还有另一张包含国家/地区列表的表格,因为在第一行中提到了美国(国家/地区名称),我需要该行。

在第二种情况下,没有国家/地区名称,因此我不需要该列。

请你澄清一下

4 个答案:

答案 0 :(得分:1)

这是一个非常糟糕的主意,加入像这样的任意文本。这将非常缓慢甚至可能无法正常工作..试一试:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

从你的帖子中找不到它,但我想你要求返回表格中包含含有某个国家名称的描述的所有行?如果是这种情况,您可以像下面这样使用sql LIKE运算符。

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

如果不是,我认为你唯一的另一个选择就是Dans post。

享受!

答案 3 :(得分:0)

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

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

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

但是,“句子”意味着标点符号,例如上述内容无法与“我在美国,果阿和伊朗工作”相提并论。您需要在开始匹配之前分隔单词。令人高兴的是,已经有解决这个问题的方案,例如SQL Server等中的全文搜索。为什么重新发明轮子?

另一个问题是,一个国家/地区可以使用多个名称,例如我的国家可以合法地称为“英国”,“英国”,“GB”(根据我的stackoverflow简介),“英格兰”(如果你问我的孩子)和“大不列颠及北爱尔兰联合王国”(后者就是我的护照上所说的内容,并且它不适合您的NVARCHAR(50)栏;)仅举几例。