如何使用 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                   -