如何使用 T-SQL 查找不在字符列表中的所有位置?
How can I use T-SQL to find all positions that are not in a list of characters?
我需要找到 所有 字符串中不是 A、G、C 或 T 的位置(这是基因组数据)。我已经想出了一种使用循环来做到这一点的方法(见下文),但老实说我不确定是否有 'smarter' 方法来做到这一点。
我正在使用 SQL 服务器。
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
DECLARE @pos int =1
DECLARE @table1 TABLE (position int, DiffValue varchar(1))
WHILE (@pos <= LEN(@myTest))
BEGIN
INSERT INTO @table1
SELECT
@pos,
CASE
WHEN SUBSTRING(@myTest, @pos, 1) NOT IN ('A','G','C','T')
THEN SUBSTRING(@myTest, @pos, 1)
END
WHERE
SUBSTRING(@myTest, @pos, 1) NOT IN ('A','G','C','T')
SELECT @pos= @pos + 1
END
SELECT * FROM @table1
结果
position DiffValue
7 X
11 X
15 -
也许有一个临时计数 table
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
Select N
,S = substring(@myTest,N,1)
From (Select Top (Len(@myTest)) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1,master..spt_values n2 ) A
Where substring(@myTest,N,1) not in ('A','G','C','T')
Returns
N S
7 X
11 X
15 -
你是不是在看下面这样的东西:
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCTADASFDASDFXASDASFASDFXASDFASDXASDAS'
;with nums as (
select top(len(@myTest)) RowN = Row_number() over(order by (Select NULL))
from master..spt_values s1, master..spt_values s2
)
select RowN as Position, DiffValue = SUBSTRING(@myTest,RowN,1) from nums
where SUBSTRING(@myTest,RowN,1) not in ('A','G','C','T')
只需获取一份 NGrams8K 和你的全部。
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
SELECT Position, Token
FROM dbo.ngrams8K(@myTest, 1)
WHERE token NOT LIKE '[AGCT]';
结果:
Position Token
-------------------- --------
7 X
11 X
15 -
我需要找到 所有 字符串中不是 A、G、C 或 T 的位置(这是基因组数据)。我已经想出了一种使用循环来做到这一点的方法(见下文),但老实说我不确定是否有 'smarter' 方法来做到这一点。
我正在使用 SQL 服务器。
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
DECLARE @pos int =1
DECLARE @table1 TABLE (position int, DiffValue varchar(1))
WHILE (@pos <= LEN(@myTest))
BEGIN
INSERT INTO @table1
SELECT
@pos,
CASE
WHEN SUBSTRING(@myTest, @pos, 1) NOT IN ('A','G','C','T')
THEN SUBSTRING(@myTest, @pos, 1)
END
WHERE
SUBSTRING(@myTest, @pos, 1) NOT IN ('A','G','C','T')
SELECT @pos= @pos + 1
END
SELECT * FROM @table1
结果
position DiffValue
7 X
11 X
15 -
也许有一个临时计数 table
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
Select N
,S = substring(@myTest,N,1)
From (Select Top (Len(@myTest)) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1,master..spt_values n2 ) A
Where substring(@myTest,N,1) not in ('A','G','C','T')
Returns
N S
7 X
11 X
15 -
你是不是在看下面这样的东西:
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCTADASFDASDFXASDASFASDFXASDFASDXASDAS'
;with nums as (
select top(len(@myTest)) RowN = Row_number() over(order by (Select NULL))
from master..spt_values s1, master..spt_values s2
)
select RowN as Position, DiffValue = SUBSTRING(@myTest,RowN,1) from nums
where SUBSTRING(@myTest,RowN,1) not in ('A','G','C','T')
只需获取一份 NGrams8K 和你的全部。
DECLARE @myTest varchar(max) = 'GGCGATXAATXCCC-GCCT'
SELECT Position, Token
FROM dbo.ngrams8K(@myTest, 1)
WHERE token NOT LIKE '[AGCT]';
结果:
Position Token
-------------------- --------
7 X
11 X
15 -