T-SQL:查找字符串中第一个a-zA-Z的位置



在Select语句中,我需要从一列中去掉前导和尾随逗号。它的值如下:

,,Value1,Value2,,,,

逗号之间没有空格。

我曾尝试使用CharIndex来查找[a-zA-Z]的第一个出现,但我不知道如何使其工作。

下面是我的代码示例:

Select CustID, SaleDate, TargetColumn, CharINDEX('a-z', TargetColumn) [Position]

[Position]列中的每一行都返回一个0。

我希望能够定位[a-zA-Z]的第一个和最后一个实例,然后分别删除这些位置之前和之后的所有内容。

我很感激以前可能有人问过这个问题,但我找不到可以在Select语句中使用的tsql代码。

如果有任何帮助/指点,我将不胜感激。

谢谢!

如果您。。。需要从一列中去掉前导和尾随逗号并且您使用SQL Server 2017+,TRIM()是一个选项:

SELECT TRIM(',' FROM TargetColumn) AS TargetColumn
FROM (VALUES (',,Value1,Value2,,,,')) t (TargetColumn)

但是,如果您想进行更复杂的解析(如注释中所述……有问题的列在实际值之间也可以有一个逗号字符串…(,基于JSON的方法(具有适当的转换和字符串拆分(是一个可能的解决方案(需要SQL Server 2016+(。这个想法是拆分文本,删除空的子字符串,然后再次标记部分:

SELECT TargetColumn = (
SELECT STRING_AGG([value], ',') WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROM OPENJSON(CONCAT('["', REPLACE(TargetColumn, ',', '","'), '"]'))
WHERE [value] <> ''
)
FROM (VALUES 
(',,Value1,Value2,,,,'),
('Food Resources,,,,,,,,,Department'),
('No commas')
) t (TargetColumn)

结果:

TargetColumn
-------------------------
Value1,Value2
Food Resources,Department
No commas

对于A-Z的第一次出现,您需要"PATINDEX"而不是"CHARDINDEX"。

PATINDEX('%[a-z]%' TargetColumn)

要找到最后一个位置,您可以使用

LEN(TargetColumn)-PATINDEX('%[^,]%', REVERSE(TargetColumn))

最新更新