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三行如下所示:
这对于原始问题来说非常强大,因为它允许我们直接过滤到单个值,而无需使用 CHARINDEX
或 LIKE
。
首先,您需要将列表(在记录中)转换为以逗号开头和结尾且不包含空格的形式。然后您可以使用 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%'
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三行如下所示:
这对于原始问题来说非常强大,因为它允许我们直接过滤到单个值,而无需使用 CHARINDEX
或 LIKE
。
首先,您需要将列表(在记录中)转换为以逗号开头和结尾且不包含空格的形式。然后您可以使用 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%'