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

Откуда: Краснодар
Сообщений: 36
Здравствуте формирую запрос вида

|WHERE JOURNAL.ISMARK = 0 AND JOURNAL.CLOSED = 5 AND LEFT(JOURNAL.DATE_TIME_IDDOC ,8)
|BETWEEN '"+ СокрЛп(ДатаНач) +"' AND '"+ СокрЛп(ДатаКон) +"' AND SHAPKADOK_Rashod.SP1267 LIKE '%" + СокрЛП(ООО Весна) + "%' OR SHAPKADOK_Rashod.SP1267 LIKE '%" + СокрЛП(Титан) + "%' ) AS ItogTable

Так как фирм которые будут перечислены ожидается шт20 не очень удобно было бы перечислять их по оператору AND
пытаюсь сделать в различных вариациях Оператор IN (LIKE '%" + СокрЛП(Титан) + "%')
программа ругается на ошибочный синтаксис
Хотелось бы примерно сделать так IN (LIKE '%" + СокрЛП(Титан) + "%',LIKE '%" + СокрЛП(ООО ВЕСНА) + "%', )

подскажите пожалуйста как можно оператор LIKE сопрягать с оператором IN
27 мар 15, 16:36    [17441537]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
o-o
Guest
[quot YanMalyakov
как можно оператор LIKE сопрягать с оператором IN[/quot]
LIKE -- неспрягаемый и в IN тоже невпрягаемый
27 мар 15, 16:42    [17441576]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
YanMalyakov
Member

Откуда: Краснодар
Сообщений: 36
o-o,
Получается что динамически нельзя передать в запрос список контрагентов IN (Like ООО Весна,Like Титан,Like ООО ЕщеЧонть)
? и придется пользоваться оператором AND или OR ?
27 мар 15, 16:46    [17441608]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
where field like '%что-то%' OR field like '%ещё%'  OR ...
27 мар 15, 16:50    [17441635]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
YanMalyakov
Member

Откуда: Краснодар
Сообщений: 36
Konst_One,Спасибо
просто я думал что есть более элегантное и красивое решение =)
чем перечисление 20 раз(а впоследствии и до 50 =) контрагентов по
OR или AND
27 мар 15, 16:55    [17441668]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
чтобы такого не просиходило нужно подготовить структуру базы и сравнивать уже по идентификаторам контрагентов (список их должен быть единым справочником), тогда и пригодится вам IN()
27 мар 15, 16:57    [17441684]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
YanMalyakov
Konst_One,Спасибо
просто я думал что есть более элегантное и красивое решение =)
чем перечисление 20 раз(а впоследствии и до 50 =) контрагентов по
OR или AND
Засунуть ваши паттерны в таблицу и написать join ... on SHAPKADOK_Rashod.SP1267 like ...
27 мар 15, 16:57    [17441686]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
YanMalyakov
Member

Откуда: Краснодар
Сообщений: 36
Всем Спасибо за ответы !!!!
27 мар 15, 17:01    [17441714]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
Кирилл Иванов
Member

Откуда:
Сообщений: 12
Если хотите через перечисление, то можно создать следующую функцию:
CREATE FUNCTION [dbo].[dba_split]
(
  @RowData nvarchar(MAX),
  @SplitOn nvarchar(5)
)
RETURNS @ReturnValue table ( Data nvarchar(MAX) )
AS
BEGIN
    DECLARE @Counter int
    SET @Counter = 1 
    WHILE ( CHARINDEX(@SplitOn, @RowData) > 0 )
          BEGIN  
                INSERT  INTO @ReturnValue
                        (
                          Data
                        )
                        SELECT  Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1,
                                                             CHARINDEX(@SplitOn,
                                                              @RowData) - 1)))
                SET @RowData = SUBSTRING(@RowData,
                                         CHARINDEX(@SplitOn, @RowData) + 1,
                                         LEN(@RowData)) 
                SET @Counter = @Counter + 1  
          END 
    INSERT  INTO @ReturnValue
            ( Data )
            SELECT  Data = LTRIM(RTRIM(@RowData))  
    RETURN  
END

А далее выполняете операцию join, как советовал Сергей Г., но с функцией, в которой перечисляете все ваши слова для поиска:
SELECT * 
FROM dbo.some_table SHAPKADOK_Rashod
    INNER JOIN [dbo].[dba_split](
						'%ООО ВЕСНА%,%Титан%,%Другие слова%',
						',' -- обязательный знак
					   ) s 
    on SHAPKADOK_Rashod.SP1267 like s.data
27 мар 15, 17:21    [17441843]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор LIKE сопрягать с оператором IN  [new]
Валдай
Member

Откуда:
Сообщений: 113
YanMalyakov,

если хочется просто перечислить шаблоны то можно так:

IF OBJECT_ID('tempdb..#a','U') IS NOT NULL DROP TABLE #a
CREATE TABLE #a(
  id int identity(1,1) primary key,
  code varchar(20)
)

INSERT #a (code) values ('abc'),('ac'),('wer'),('xyz')


select *
from #a a
where exists (
  select *
  from (values('%a_c%'),('%w%'))x(l)
  where a.code like  x.l
)
27 мар 15, 17:23    [17441851]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить