我正在尝试处理字符串,以便只采用大写字母和数字。尝试使用PATINDEX,因为我想保持这种简洁 - 它将成为更大查询的一部分。
有很多例子显示出类似的东西,但我似乎错过了一些东西。到目前为止我已经
了DECLARE @string varchar(100)
SET @string = 'AbcDef12-Ghi'
WHILE PATINDEX('%[^A-Z0-9]%',@string) <> 0
SET @string = STUFF(@string,PATINDEX('%[^A-Z0-9]%',@string),1,'')
SELECT @string
根据例如this question,但这似乎没有做我需要的。
使用[^0-9]
输出12
,这是正确的。
但是[^A-Z]
输出AbcDefGhi
,即大写和小写。无论我使用[^A-Z]
还是[^a-z]
,都会返回所有字母。
我想我可能会遗漏一些简单的东西?我找到了一些关于整理的建议,并尝试按照this使用COLLATE与PATINDEX,但无法使其工作。
注意:我这样做是作为SQL Server数据库上的一次性查询来查找一些数据 - 这不会在其他地方重复使用,所以像性能,SQL注入(在此上下文中经常提到)等。不是问题。
答案 0 :(得分:6)
您可以使用COLLATE
和区分大小写的排序规则(例如Latin1_General_BIN
:
DECLARE @string varchar(100)
SET @string = 'AbcDef12-Ghi'
WHILE PATINDEX('%[^A-Z0-9]%',@string COLLATE Latin1_General_BIN) <> 0
BEGIN
SET @string = STUFF(
@string,
PATINDEX('%[^A-Z0-9]%',@string COLLATE Latin1_General_BIN),1,''
)
END
SELECT @string
这将输出:
AD12G