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
答案 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
上面的代码将返回三行,如下所示:
这对于原始问题非常强大,因为它允许我们直接过滤为单个值,而无需使用SELECT
*
FROM
string_split('String1;String2;String3', ';')
或CHARINDEX
。
答案 1 :(得分:3)
首先,您需要将列表(以斜线表示)转换为以逗号开头和结尾且不包含空格的形式。然后,您可以结合使用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 :(得分: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%'