Transact SQL - 可变长度字符串的每 5 个字符获取第一个字符

Transact SQL - Get first character every 5 characters of a variable length string

我有一个如下所示的字符串

A1234B1234C1234

我想每 5 个字符取第一个字符。

结果会是

ABC

字符串长度可变,因此长度可以是 5、10、20、30 等

试试这个

Create function UDF_ExtractAlphabets
(  
  @input varchar(255)  
)  
Returns varchar(255)  
As  
Begin  
  Declare @alphabetIndex int = Patindex('%[^a-zA-Z]%', @input)  
  Begin  
    While @alphabetIndex > 0  
    Begin  
      Set @input = Stuff(@input, @alphabetIndex, 1, '' )  
      Set @alphabetIndex = Patindex('%[^a-zA-Z]%', @input )  
    End  
  End  
  Return @input
End


SELECT left(dbo.UDF_ExtractAlphabets(yourtext),5)  FROM dbo.tablename

假设您使用的是完全支持的 SQL 服务器版本,并且您 实际上想要获取每 5 个字符,您可以使用 Tally 和 STRING_AGG 实现这个:

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (8000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4)
SELECT STRING_AGG(SS.C,'') AS NewColumn
FROM (VALUES('A1234B1234C1234'))V(YourColumn)
     JOIN Tally T ON LEN(YourColumn) >= T.I
     CROSS APPLY (VALUES(SUBSTRING(V.YourColumn,T.I,1)))SS(C)
WHERE (T.I-1) % 5 = 0
GROUP BY V.YourColumn;

但是,如果您实际上只想保留字母字符,我会使用 TRANSLATEREPLACE:

SELECT REPLACE(TRANSLATE(V.YourColumn, '0123456789',REPLICATE('|',LEN('0123456789'))),'|','') AS NewColumn
FROM (VALUES('A1234B1234C1234'))V(YourColumn)

注意,如果值是一个变量,如果使用 Tally 解决方案,我会推荐这种方法:

DECLARE @YourString varchar(8000) = 'A1234B1234C1234';

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (LEN(@YourString)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4)
SELECT STRING_AGG(SS.C,'') AS NewColumn
FROM Tally T
     CROSS APPLY (VALUES(SUBSTRING(@YourString,T.I,1)))SS(C)
WHERE (T.I-1) % 5 = 0;