2010-08-10 2 views
0

Предположим, у меня есть столбец описания, содержащийПолучить слова из предложения - SQL

Column Description 
------------------ 
I live in USA 
I work as engineer 

У меня есть другой таблицы, содержащей перечень стран, с США (название страны) упоминается в первом ряду, мне нужно, что ряд.

Во втором случае нет названия страны, поэтому мне не нужна эта колонка.

Можете ли вы уточнить

+0

«Во втором случае нет имени страны, поэтому мне не нужен этот столбец» - вы действительно хотите выбрать столбцы? – onedaywhen

+2

Как насчет фразы «Я ЕСМЬ БОЛЬШИНСТВО США» - должен ли * * соответствовать стране США? – onedaywhen

+0

@onedaywhen: Yousa right!

ответ

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) 
+0

INSTR также работал бы над Oracle –

+0

@OMG: Спасибо ... Обновление. –

+0

@OMG: Как вы думаете, 'LIKE' лучше в этом случае? –

1

Это действительно плохая идея, чтобы присоединиться на произвольный текст, как это. Это будет очень медленно и может даже не работать .. дать ему шанс:

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

+1: Beat me; мог бы использовать полнотекстовый поиск, если бы мы знали базу данных (или третью сторону, такую ​​как Sphinx & Solr). –

0

Его не entierly ясно из вашего поста, но я думаю, что вы просите, чтобы вернуть все строки в таблице, которые содержат описания, которые содержат определенное название страны? Если это так, вы можете просто использовать оператор sql LIKE следующим образом.

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

Если нет, я думаю, что ваш единственный выбор - сообщение Dans.

Наслаждайтесь!

+0

хорошо, как и оператор хороший, но я не хочу жестко кодировать названия стран, у меня есть 100 названий стран здесь и завтра некоторые новые страны могут быть добавлены, и мне придется снова жестко закодировать его здесь .... Спасибо для ответа .... – user130561

+0

вы можете легко сделать эту динамику, вставив вложенный выбор - я обновил сообщение. Благодаря! – Doug

0

Все предложения пока что соответствуют частичным словам, например. «Я ЕСМЬ БОЛЬШИНСТВО» будет соответствовать стране «США». Вопрос подразумевает, что сопоставление должно выполняться целыми словами.

Если текст был полностью состоял из буквенно-цифровых символов и каждое слово, разделенных пробелом, вы могли бы использовать что-то вроде этого

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

Однако, «предложение» подразумевает знаки препинания, например, вышеупомянутое не соответствовало бы «Я работаю в США, Гоа и Иране». Вам нужно разграничить слова, прежде чем вы сможете их согласовать. К счастью, уже есть решения этой проблемы, например. полнотекстовый поиск в SQL Server и т. п. Зачем изобретать колесо?

Другая проблема заключается в том, что одна страна может проходить по многим именам, например. моя страна может на законных основаниях называться «Британия», «Великобритания», «ГБ» (согласно моему профилю stackoverflow), «Англия» (если вы спросите моих детей) и «Соединенное Королевство Великобритании и Северной Ирландии» (последнее - это то, что сказано в моем паспорте, и нет, он не будет вписываться в ваш столбец NVARCHAR(50);), чтобы назвать лишь некоторые из них.

Смежные вопросы