SQL 状况良好

SQL IN condtion

select transferTypes from TransferData 

transferTypes 
--------------
TTH, TT
TRANSIT, TTH
ST, TRANSIT
TRANSIT, TTH
ST, TT

是否有任何方法或内置函数可以实现以下结果?

尝试了以下 IN 条件,但无法获得所需结果。

预期结果:

select transferTypes from TransferData where transferTypes in ('TT, ST')

transferTypes 
-------------
TTH, TT
ST, TRANSIT
ST, TT

select transferTypes from TransferData where transferTypes in ('TTH, TRANSIT')

transferTypes 
-------------
TTH, TT
TRANSIT, TTH
ST, TRANSIT
TRANSIT, TTH

select transferTypes from TransferData where transferTypes in ('TT')

transferTypes 
-------------
TTH, TT
ST, TT

最简单的方法是使用在 SQL Server 2016 及更高版本中引入的 string_split

SELECT 
    DISTINCT a.transferTypes
FROM 
    TransferData a
CROSS APPLY 
    string_split([transferTypes], ',') b
WHERE 
    TRIM(b.[value]) IN ('TT', 'ST')

以上拆分了 transferTypes 中的所有值,并允许您按单个值进行搜索。如果您使用的版本低于 SQL Server 2016,您始终可以创建一个函数来执行完全相同的操作(例如 T-SQL split string

====================================== ========

string_split的一些解释:

string_split 是一个 table 值函数,简而言之意味着该函数将输出 table。给定一个字符串输入,string_split 将根据您指定的分隔符输出多行子字符串。

以下面为例:

SELECT 
    *
FROM 
    string_split('String1;String2;String3', ';')

以上代码将return三行如下所示:

这对于原始问题来说非常强大,因为它允许我们直接过滤到单个值,而无需使用 CHARINDEXLIKE

首先,您需要将列表(在记录中)转换为以逗号开头和结尾且不包含空格的形式。然后您可以使用 charindex 结合 or 运算符来检查特定值是否包含在记录中:

declare @TransferData  table (transferTypes varchar(20));
insert into @TransferData values
('TTH, TT'),
('TRANSIT, TTH'),
('ST, TRANSIT'),
('TRANSIT, TTH'),
('ST, TT');

select * from (
    select ',' + replace(transferTypes, ' ', '') + ',' transferTypes from @TransferData
) a
where charindex(',TT,', transferTypes) > 0
or charindex(',ST,', transferTypes) > 0

这里有一个关于如何实现这一点的说明性示例。在选择中使用明显的变量。您从未指定分隔列表中有多少项目,因此我根据示例数据假设 2。

如果它是多种多样的,那么也许某种形式的动态 SQL 可能是一天中的顺序。

create table #transferdata
( 
 transferTypes  varchar(100) 
) 

insert into #transferdata select 'TTH, TT'
insert into #transferdata select 'TRANSIT, TTH'
insert into #transferdata select 'ST, TRANSIT'
insert into #transferdata select 'TRANSIT, TTH'
insert into #transferdata select  'ST, TT'


;WITH tmp AS
(
    SELECT

        LEFT(transferTypes , CHARINDEX(',', transferTypes  + ',') - 1) as col1 ,
        ltrim(STUFF(transferTypes , 1, CHARINDEX(',', transferTypes  + ','), '')) as col2
    FROM #transferdata

)
SELECT * into #tmp 
FROM tmp;

select * from #tmp as t where (t.col1 = 'tt' or t.col2 = 'tt') or (t.col1 = 'st' or t.col2 = 'st')
select * from #tmp as t where (t.col1 = 'tth' or t.col2 = 'tth') or (t.col1 = 'transit' or t.col2 = 'transit')
select * from #tmp as t where (t.col1 = 'tt' or t.col2 = 'tt') or (t.col1 = 'tt' or t.col2 = 'tt')


drop table #tmp
drop table #transferdata

这样的事情怎么样:

select 
  transferTypes 
from 
  TransferData 
where 
  transferTypes like '%TT%'
  or transferTypes like '%ST%'