SQL: объединение LIKE и IN в SQL и отображение массива LIKE в столбце - PullRequest
0 голосов
/ 12 января 2019

Ниже код работает для объединения Like и IN. Но мне нужен столбец в выходных данных со значениями, которые я использовал для Like:

SELECT file_id
FROM   table1 as t
WHERE  archival_date = '20180108'
WHERE  EXISTS(SELECT *
              FROM   (VALUES ('%portfolo1filename%'),
                             ('%portfolo2filename%'),
                             ('%portfolo3filename%')) Vals(val)
              WHERE  filename LIKE '%' + val + '%')  

Что мне нужно для вывода:

____________________________
val                  file_ID
____________________________
portfolo1filename     2230
portfolo2filename     2240
portfolo3filename     3345        

Вывод текущего кода:

______________
   file_ID
______________
     2230
     2240
     3345    

Примечание: val здесь содержит список значений (т.е. имен файлов), которые мне нужно искать как

таблица1 имеет следующие записи:


filename                             file_ID    archival_date 
__________________________________________________________________
Broker1_portfolo1filename             2230         20180108
Broker1_portfolo2filename             2240         20180108
Broker2_portfolo3filename             3345         20180908
Broker2_portfolo2filename             1345         20180904
Broker3_portfolo1filename             3045         20180906
Broker2_portfolo2filename             3355         20180907
Broker2_portfolo3filename             7340         20180901

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Одним из решений было бы преобразование вашего предложения WHERE EXISTS в INNER JOIN, например:

SELECT t1.file_id, vals.val
FROM
    table1 t1
    INNER JOIN  (VALUES ('value1'), ('value2'), ('value3')) Vals(val) 
        ON  t1.column1 LIKE '%' + vals.val + '%' 

Недостатком этого подхода является то, что если несколько выражений соответствуют значению column1 в данной записи, вы найдете две строки в выводе. Чтобы избежать этого, вы можете, например, объединить все успешно сопоставленные выражения в одном поле.

Если вы используете SQL Server 2017 (ваш запрос отлично работает в этой СУБД), вы можете использовать STRING_AGG:

SELECT t1.file_id, STRING_AGG(vals.val, ',')
FROM   
    table1 t1
    INNER JOIN  (VALUES ('value1'), ('value2'), ('value3')) Vals(val) 
        ON  t1.column1 LIKE '%' + vals.val + '%' 
GROUP BY t1.file_id

Проверено в на этой скрипке БД .

0 голосов
/ 12 января 2019

это может помочь,

select  distinct file_id, val
from table1,  VALUES ('%portfolo1filename%'),
                     ('%portfolo2filename%'),
                     ('%portfolo3filename%')) Vals(val)
where column1 like '%' + val + '%'

рабочий код Вы можете проверить сами

CREATE TABLE [dbo].[table1](
    [id] [int] NULL,
    [column1] [varchar](40) NULL
) ON [PRIMARY]
GO

insert into table1 values (2230,    'portfolo1filename');
insert into table1 values (2245,    'portfolo2filenamedasdas');
insert into table1 values (2250,    'porto');


select  distinct id, val
from table1, (VALUES ('%portfolo1filename%'),
                     ('%portfolo2filename%'),
                     ('%portfolo3filename%')) Vals(val)
where column1 like '%' + val + '%'

Рабочая скрипка

...