Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получить список совпадений по ключевым словам из фразы  [new]
_=ДОБРЫНЯ=_
Member

Откуда:
Сообщений: 295
Всем привет.
После юзанья здешнего поиска и гугла 2 часа - все смешалось, и не могу определиться что мне делать.
Задача такова. Есть таблица WordsList -> в ней 2 колонки "Words" и "ID". В этой таблице может находиться n-ое кол-во наборов слов причем на разных языках. И есть фраза к примеру: ";189498213;934 Оплата за труд человека в кол-ве одного состовляет 400 рубасов из них 2% за 3 месяца в пенсионный фонд состовляет 20 рубасов по курсу 14. код: КА554"

Вопрос: как проще всего получить список "ID" из таблицы WordsList в котороых присутствуют совпадения слов из фразы?
18 ноя 13, 22:45    [15151268]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
_=ДОБРЫНЯ=_
Member

Откуда:
Сообщений: 295
забыл добавить mssql 2008R2 express
18 ноя 13, 22:45    [15151269]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Попробуйте так.
DECLARE  @str VARCHAR(MAX) = ';189498213;934 Оплата за труд человека в кол-ве одного состовляет 400 рубасов из них 2% за 3 месяца в пенсионный фонд состовляет 20 рубасов по курсу 14. код: КА554'
DECLARE  @tbl TABLE (F1 VARCHAR(MAX));

WHILE CHARINDEX(' ',@str) > 0
BEGIN
    INSERT INTO @tbl(F1) VALUES (RTRIM(LEFT(@str, CHARINDEX(' ',@str))))
    SET @str = RIGHT(@str, LEN(@str) - CHARINDEX(' ',@str))
END

INSERT INTO @tbl(F1) VALUES (RTRIM(@str))

SELECT DISTINCT w.ID FROM @tbl as t
INNER JOIN WordTable as w ON w.Word = t.F1
19 ноя 13, 01:05    [15151805]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
_=ДОБРЫНЯ=_
Member

Откуда:
Сообщений: 295
2 SandalTree
Спасибо. С набором слов работает как надо.
Возник еще вопрос: если в таблице слов находится такие наборы как "Оплата за труд человека", "за труд человека в кол-ве", "189498213", "пенсионный фонд" - как прописать условие?
19 ноя 13, 01:56    [15151935]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
sdet
Member

Откуда:
Сообщений: 463
_=ДОБРЫНЯ=_,

WHERE @mainstring LIKE '%'+ColumnName+'%'
19 ноя 13, 02:39    [15152004]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
_=ДОБРЫНЯ=_
Member

Откуда:
Сообщений: 295
2 sdet
Согласен

2 all
Еще возник вопрос с CHARINDEX. Посмотрев на мсдн пример сделал запрос и получил результат которого не должно быть.
SELECT        CHARINDEX('пенсионный фонд', 'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS) AS Result

Результат выдает 4.
Почему выдает 4 а не 0? ведь во фразе 'Перерахування грошових коштів , без ПДВ' нет такого словосочетания 'пенсионный фонд'! Объясните плиззз.
19 ноя 13, 14:16    [15154627]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
_=ДОБРЫНЯ=_,

Посмотрите на результат запроса:
SELECT 'пенсионный фонд' COLLATE Latin1_General_CI_AS AS String_1,
       'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS AS String_2,
       CHARINDEX('пенсионный фонд', 'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS) AS Result

Либо всё сразу станет ясно, либо возникнет ещё вопрос :-)
19 ноя 13, 14:24    [15154678]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
_=ДОБРЫНЯ=_
Member

Откуда:
Сообщений: 295
Гость333
_=ДОБРЫНЯ=_,

Посмотрите на результат запроса:
SELECT 'пенсионный фонд' COLLATE Latin1_General_CI_AS AS String_1,
       'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS AS String_2,
       CHARINDEX('пенсионный фонд', 'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS) AS Result

Либо всё сразу станет ясно, либо возникнет ещё вопрос :-)



Вопрос таки возник - при выполнении запроса в результате появляются одни "?". Что это означает?
+ странная штука получается. мне важно чтоб не учитывался регистр букв, на мсдн в примере приведено вставлять COLLATE Latin1_General_CI_AS. Только что эксперементировал и убрал этот COLLATE - показывает 0. Все норм как бы. Вместо 'пенсионный фонд' вствил 'ГрОШОвиХ Коштів' - показыват результат правильный и при этом регистр так же не учитывается.
А если нужно учитывать регистр - нужно добавлять COLLATE Latin1_General_CS_AS?
19 ноя 13, 15:36    [15155298]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
o-o
Guest
_=ДОБРЫНЯ=_,

Вы не то поняли.
на регистрозависимость влияет только префикс в названии коллэйшена: CS = case sensitive, CI = case insensitive.
а советовать сравнивать кириллицу в латинском коллэйшене мсдн вряд бы стал.

+ раз у Вас там на разных языках наворочено, то Вы поди в юникоде все храните,
какого типа Ваше поле Words, nvarchar?

чтоб пример поправить, всюду перед строками допишите, чтов в юникод превратить:
SELECT CHARINDEX(N'пенсионный фонд', N'Перерахування грошових коштів , без ПДВ' COLLATE Latin1_General_CI_AS) AS Result
19 ноя 13, 15:58    [15155500]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
o-o
Guest
сравните вот такое:
SELECT CHARINDEX(N'ПЕНС', N'фонд пенсионный фонд' COLLATE Latin1_General_CI_AS) AS CI,
       CHARINDEX(N'ПЕНС', N'фонд пенсионный фонд' COLLATE Latin1_General_CS_AS) AS CS


т.е. от коллейшена нам тут нужна только часть "реагирования на регистр",
язык неважен, т.к. я передаю строки в юникоде, поэтому могу себе позволить Latin.
если же строки в varchar (не nvarchar, т.е. неюникодные), то используйте свой кирилличесий коллэйшн CI.
19 ноя 13, 16:11    [15155610]     Ответить | Цитировать Сообщить модератору
 Re: Получить список совпадений по ключевым словам из фразы  [new]
Valer
Member

Откуда:
Сообщений: 282
распарсить строку можно одним селектом, без CHARINDEX, если слова длиной 1-2 символа
не нужны , можно выставить доп условие

DECLARE  @str VARCHAR(500) 
set  @str  = ';189498213;934 Оплата за труд человека в кол-ве одного состовляет 400 рубасов из них 2% за 3 месяца в пенсионный фонд состовляет 20 рубасов по курсу 14. код: КА554'
declare @delim char(1)
select @delim = ' '
--- условие применения :
---   длина анализируемой строки <=  select max(number) from  master.dbo.spt_values where type='P'   
--- ищем разделители
with  tdelim ( numb  ) as 
 ( select  v.number 
     from master.dbo.spt_values v 
     where  v.number <= len(@str) and v.number > 0 and  v.type='P' 
        and  substring( @str , v.number ,1) = @delim
     --- + учитывем кончики
     union  select 0
     union  select len(@str) +1
  )
---  слова из строки
select  substring( @str , numb+1 ,sled - numb -1)  as slowo
     from (   select numb, 
              ( select min(numb) 
                 from  tdelim n2  where n2.numb > n1.numb ) as sled
                 from  tdelim n1
          )  bbb
  where (numb +1) != sled
20 ноя 13, 17:38    [15163631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить