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;
但是,如果您实际上只想保留字母字符,我会使用 TRANSLATE
和 REPLACE
:
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;
我有一个如下所示的字符串
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;
但是,如果您实际上只想保留字母字符,我会使用 TRANSLATE
和 REPLACE
:
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;