SQL IN条件

时间:2019-05-13 07:16:55

标签: sql-server tsql

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

4 个答案:

答案 0 :(得分:13)

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

string_split

以上内容将SELECT DISTINCT a.transferTypes FROM TransferData a CROSS APPLY string_split([transferTypes], ',') b WHERE TRIM(b.[value]) IN ('TT', 'ST') 中的所有值分割开,并允许您按单个值进行搜索。如果您使用的版本低于SQL Server 2016,则始终可以创建一个函数来执行完全相同的操作(例如T-SQL split string

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

有关操作的一些解释 transferTypes

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

以以下为例:

string_split

上面的代码将返回三行,如下所示:

Three string rows returned

这对于原始问题非常强大,因为它允许我们直接过滤为单个值,而无需使用SELECT * FROM string_split('String1;String2;String3', ';') CHARINDEX

答案 1 :(得分:3)

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

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 :(得分:2)

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

如果变化很大,那么某种形式的Dynamic 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

答案 3 :(得分:2)

怎么样呢?

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