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

Откуда: из-за границы
Сообщений: 2113
есть таблица с полем текстов
и есть таблица со словами для поиска

T1
text
....................

T2
Word
.......................

мне нужно найти все строки из первой таблицы
для котрых выполняется условие
...
where T1.text like T2.Word(1) And  T1.text like T2.Word(2) And T1.text like T2.Word(3) 
....

можно ли как то извратится без динамического запроса
и если я использую конструкцию вида

SELECT * FROM T1 ,T2
where T1.text like T2.Word
то это имеется в виду OR ?

Спасибо
28 янв 08, 15:34    [5211495]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
SELECT t1.* 
FROM T1
   inner join T2 t2
      on T1.text like T2.Word
   inner join T2 t3
      on T1.text like T3.Word
   inner join T2 t4
      on T1.text like T4.Word
28 янв 08, 15:37    [5211529]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Что такое T2.Word(1), T2.Word(2), T2.Word(3)?
У Вас точно MSSQL Server?
28 янв 08, 15:38    [5211534]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
да MSSQL Server
я имел ввиду 1 значение 2 значение 3 значение ...
из таблицы T2

проблема кол-во слов для поиска может быть разное
28 янв 08, 15:40    [5211566]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
michael R
да MSSQL Server
я имел ввиду 1 значение 2 значение 3 значение ...
из таблицы T2

проблема кол-во слов для поиска может быть разное
Пример данных покажите :))
28 янв 08, 15:42    [5211588]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
T1
text
gdfgdgfdgfd
tretertre
dffdgdfgfdgd
aaaaaaaaa
bbbbbbbb
ccccccc
ddddddd aaaaa bbbbbb ccccc
...........

T2
Word
aaa
bbb
ccc
dddd
...........

where text like '%aaa%' and text like '%bbb%' and text like '%ccc%' and text like '%dddd%'

должна быть последняя строчка
28 янв 08, 15:47    [5211628]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT T1.[text]
FROM T1 JOIN T2 ON T1.[text] LIKE '%'+T2.Word+'%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);
??
28 янв 08, 16:17    [5211891]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
iap


Спасибо похоже на правду
буду тестировать
28 янв 08, 16:35    [5212069]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Если Word может содержать левую квадратную скобку, процент или подчёркивание, и эти символы надо рассматривать как часть текста, а не как шаблон для поиска, то более точно, наверно, так:
SELECT T1.[text]
FROM T1 JOIN T2 ON T1.[text] LIKE '%'+REPLACE(REPLACE(REPLACE(T2.Word,'[','[[]'),'%','[%]'),'_','[_]')+'%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);
28 янв 08, 17:15    [5212368]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
iap
Если Word может содержать левую квадратную скобку, процент или подчёркивание, и эти символы надо рассматривать как часть текста, а не как шаблон для поиска, то более точно, наверно, так:


слова я разбиваю заранее по всем возможным спецсимволам
так что в конце только буквы или цифры

ещё раз спасибо
решение действительно очень изящное
28 янв 08, 17:27    [5212453]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
FiGr
Member

Откуда: Иваново
Сообщений: 259
iap
Если Word может содержать левую квадратную скобку, процент или подчёркивание, и эти символы надо рассматривать как часть текста, а не как шаблон для поиска, то более точно, наверно, так:
SELECT T1.[text]
FROM T1 JOIN T2 ON T1.[text] LIKE '%'+REPLACE(REPLACE(REPLACE(T2.Word,'[','[[]'),'%','[%]'),'_','[_]')+'%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);


HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);
- это зачем?
28 янв 08, 17:35    [5212520]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
FiGr
iap
Если Word может содержать левую квадратную скобку, процент или подчёркивание, и эти символы надо рассматривать как часть текста, а не как шаблон для поиска, то более точно, наверно, так:
SELECT T1.[text]
FROM T1 JOIN T2 ON T1.[text] LIKE '%'+REPLACE(REPLACE(REPLACE(T2.Word,'[','[[]'),'%','[%]'),'_','[_]')+'%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);


HAVING COUNT(*)=(SELECT COUNT(*) FROM T2);
- это зачем?
Чтобы в результат попали только строки T1, которые содержат все текстовые фрагменты, перечисленные в T2
28 янв 08, 17:37    [5212532]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Возможно, и такое решение подойдёт:
SELECT T1.[text] FROM T1 WHERE NOT EXISTS
(
 SELECT * FROM T2
 WHERE T1.[text] NOT LIKE '%'+REPLACE(REPLACE(REPLACE(T2.Word,'[','[[]'),'%','[%]'),'_','[_]')+'%'
);
28 янв 08, 19:29    [5213073]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
опять я вернулся

в случаи если есть одинаковые тексты в таблице для поиска
вышеуказанная конструкция не работает

declare @T1 Table ([text] nvarchar(50));
Insert into @T1([text]) values 
('aaa ,bbb, ccc, ddd'),('ddd, aaa, bbb ,ccc'),('bbb'),('ccc'),('aaa ,bbb, ccc, ddd') ;

declare @T2 Table (Word nvarchar(50));
Insert into @T2(Word) values 
('ddd'),('aaa'),('bbb'),('ccc');

SELECT T1.[text]
FROM @T1 T1 JOIN @T2 T2 ON 
	T1.[text] = T2.Word
	or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word  
	or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word + '[^A-Za-z0-9]%'
	or T1.[text] like T2.Word + '[^A-Za-z0-9]%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM @T2 T2 );

как такое побороть ?
спасибо
19 июн 13, 22:52    [14456709]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
michael R,

Как то так
declare @T1 Table ([text] nvarchar(50));
Insert into @T1([text]) values 
('aaa ,bbb, ccc, ddd'),('ddd, aaa, bbb ,ccc'),('bbb'),('ccc'),('aaa ,bbb, ccc, ddd') ;

declare @T2 Table (Word nvarchar(50));
Insert into @T2(Word) values 
('ddd'),('aaa'),('bbb'),('ccc');

SELECT T1.[text]
FROM (select T1.[text], ROW_NUMBER() over(order by (select 1)) as rn from @T1 T1) T1
inner JOIN @T2 T2 ON 
	T1.[text] = T2.Word
	or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word  
	or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word + '[^A-Za-z0-9]%'
	or T1.[text] like T2.Word + '[^A-Za-z0-9]%'
GROUP BY T1.[text], T1.rn
HAVING COUNT(*)=(SELECT COUNT(*) FROM @T2 T2 );
19 июн 13, 23:15    [14456831]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
natya
Member [заблокирован]

Откуда: Азербайджан, Баку
Сообщений: 347
Alexander Titkin,

а ваш скрипт тоже не работает
19 июн 13, 23:33    [14456917]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
natya
Member [заблокирован]

Откуда: Азербайджан, Баку
Сообщений: 347
natya,

declare @T1 Table ([text] nvarchar(50));
Insert into @T1([text])values ('aaa ,bbb, ccc, ddd')
Insert into @T1([text]) values ('ddd, aaa, bbb ,ccc')
Insert into @T1([text]) values ('ddd, aaa, bbb ,ccc')
Insert into @T1([text]) values('bbb')
Insert into @T1([text]) values('ccc')
Insert into @T1([text]) values('aaa ,bbb, ccc, ddd') ;

declare @T2 Table (Word nvarchar(50));

Insert into @T2(Word) values ('ddd')
Insert into @T2(Word) values ('aaa')
Insert into @T2(Word) values ('bbb')
Insert into @T2(Word) values ('ccc');


select *from @T1
select *from @T2
SELECT T1.[text]
FROM @T1 T1 JOIN @T2 T2 ON
T1.[text] = T2.Word
or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word
or T1.[text] like '%[^a-zA-Z0-9]'+ T2.Word + '[^A-Za-z0-9]%'
or T1.[text] like T2.Word + '[^A-Za-z0-9]%'
GROUP BY T1.[text]
HAVING COUNT(*)=(SELECT COUNT(*) FROM @T2 T2 );







-----------------

(строк обработано: 1)
text
--------------------------------------------------
aaa ,bbb, ccc, ddd
ddd, aaa, bbb ,ccc
ddd, aaa, bbb ,ccc
bbb
ccc
aaa ,bbb, ccc, ddd

(строк обработано: 6)

Word
--------------------------------------------------
ddd
aaa
bbb
ccc

(строк обработано: 4)

text
--------------------------------------------------

(строк обработано: 0)
19 июн 13, 23:42    [14456939]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
natya
у меня работает чётко
SQL 2008
19 июн 13, 23:50    [14456955]     Ответить | Цитировать Сообщить модератору
 Re: Like через вспомагательную таблицу  [new]
anti-natya
Guest
natya
Alexander Titkin,

а ваш скрипт тоже не работает


это твой скрипт с выкинутым Row_Number (который в группировке участвует) не работает,
а со скриптом автора все ок.

(щас скажет: у меня 2000, там нету!)
это типа как прийти с претензиями:
ваша кофеварка кофе не варит, вон, только воду кипятит.
-- а по инструкции все делал? кофе-то положил?
-- не, не положил, у меня его НЕТУ!
20 июн 13, 12:04    [14458854]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить