SQL:在SQL中合并LIKE和IN,并在一列中显示LIKE的数组
SQL: Combining LIKE and IN in SQL , and Showing the Array of LIKE in a column
下面的代码用于组合 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
这可能有帮助,
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 + '%'
一个解决方案是将您的 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(您的查询在此 RDBMS 上运行良好),您可以使用 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
测试于 this db fiddle。
下面的代码用于组合 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
这可能有帮助,
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 + '%'
一个解决方案是将您的 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(您的查询在此 RDBMS 上运行良好),您可以使用 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
测试于 this db fiddle。