Bor*_*ris 1 t-sql sql-server sql-server-2008-r2
我正在尝试处理一个字符串,以便只采用大写字母和数字.试图使用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
Run Code Online (Sandbox Code Playgroud)
根据例如这个问题,然而这似乎并没有做我需要的.
使用[^0-9]输出12,这是正确的.
但[^A-Z]输出AbcDefGhi,即大写和小写.如果我使用[^A-Z]或者[^a-z]都返回所有字母都没关系.
我想我可能会遗漏一些简单的东西?我发现了一些建议,指整理并试图用逐份PATINDEX按照这个,但不能让它开始工作.
注意:我这样做是作为SQL Server数据库上的一次性查询来查找一些数据 - 这不会在其他任何地方重复使用,所以像性能,SQL注入(在这种情况下经常提到)等不是关心.
您可以使用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
Run Code Online (Sandbox Code Playgroud)
这将输出:
AD12G