【问题标题】:SQL: Combining LIKE and IN in SQL , and Showing the Array of LIKE in a columnSQL:在 SQL 中结合 LIKE 和 IN,并在一列中显示 LIKE 的数组
【发布时间】:2019-01-11 22:29:29
【问题描述】:

下面的代码可以结合 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 包含我需要搜索的值列表(即文件名)

table1 有以下条目:


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

【问题讨论】:

  • 数据库是什么?
  • 请提供样本数据和预期结果
  • 这是作业题吗?
  • @KeithJohnHutchison:几乎没有,我只是想根据文件名匹配模式填充文件名 ID
  • @TheImpaler: table1 是数据库

标签: sql sql-server string tsql sql-like


【解决方案1】:

一种解决方案是将您的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

选择 t1.file_id, STRING_AGG(vals.val, ',') 从 表 1 t1 内连接(值('value1'),('value2'),('value3'))Vals(val) ON t1.column1 LIKE '%' + vals.val + '%' 按 t1.file_id 分组

this db fiddle 测试。

【讨论】:

  • 您的代码在 val 列中包含 % 符号(指您提供的第一个代码)。你能告诉我如何删除它吗?输出: Val : %portfolo1filename%
  • @AnandKC:好的,让我检查一下
  • 输出中的 % 并非来自我的查询。您只需从您放入 VALUES (...) 子句的值中删除 %
  • 应该是VALUES ('portfolo1filename'), ('portfolo2filename'), ('portfolo3filename')
  • 欢迎@AnandKC
【解决方案2】:

这可能会有所帮助,

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 + '%'

Working Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多