SQL Server 2008-删除前面带有数字的重复字符

SQL Server 2008-删除前面带有数字的重复字符,sql,sql-server-2008,replace,substring,Sql,Sql Server 2008,Replace,Substring,我有一个字符串,它可能包含也可能不包含重复字母z。重复的z的前面总是有一个数字。它被用作填充物。我遇到的问题是,字符串可能包含合法的字母z,前面没有数字,因此我无法简单地将所有z替换为' 以下是一个示例: declare @criteria varchar(max) set @criteria = ' Process Level = 31129 Process Level = 32045zzzz Leader = Gail Zimmerman Process Level &

我有一个字符串,它可能包含也可能不包含重复字母
z
。重复的
z的
前面总是有一个数字。它被用作填充物。我遇到的问题是,字符串可能包含合法的字母
z
,前面没有数字,因此我无法简单地将所有
z
替换为
'

以下是一个示例:

declare @criteria varchar(max)
set @criteria = ' Process Level = 31129     Process Level = 32045zzzz   Leader = Gail     Zimmerman  Process Level >= 21 AND Process Level <= 25zzzzzzz  Leader = John Schwartz   '
declare@criteria varchar(最大值)

设置@criteria='过程级别=31129过程级别=32045ZZZ领导=Gail Zimmerman过程级别>=21和过程级别愚蠢的问题;你到底为什么要用标准字符作为填充符

无论如何。。。这有点复杂,但您可以使用REVERSE函数向后翻转字符串,使用LEFT函数修剪现在领先的Z(而不是拖尾),然后再次反转字符串

完整的“aircode”(更倾向于VBA,因为这是我的强项),但我的想法如下:

X = REVERSE(ProcessLevel)

For Z = 1 to Len(X)
  If Left(X) = "Z" then
    X = Right(X, Len(X) -Z)
  Else
    X = Reverse(X)
  EndIf
Next Z

ProcessLevel = X

这是针对T-SQL的,在其他RDBMS中可能存在语法变化

免责声明:这很慢,而且确实不是很漂亮,但是由于完整的正则表达式不是SQL的一部分,如果您必须在该语言中执行此操作,那么就没有什么可以做的了

while @criteria like '%[0-9]Z%'
begin
select @criteria = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@criteria, '1z','1'), '2z', '2'), '3z','3'),'4z','4'),'5z','5'),'6z','6'),'7z','7'),'8z','8'),'9z','9'),'0z','0')
end

select @criteria

看起来该字符串是从其他字段的选择中组合而成的。如果可能的话,与他们一起工作会简单得多。

我不是正则表达式大师,如果你能得到更好的答案,我尝试完整地回答会非常缓慢,但有些事情是类似于
[[number]][z]
查找这些部分可能是必需的-不确定您使用什么RDBMS来提供更具体的语法,但您特定RDBMS中的正则表达式可能是一个很好的起点。从研究角度来看,“列”的数量是否固定?有多少列?谢谢,很遗憾,regex不是一个可用的命令。这些列不是固定的。数据可以为空,也可以多达数千个字符。这是一个审计日志,字段是ntext。是的,它是其他字段的组合,不幸的是,我必须查询日志中的数据(时间点),因此我仅限于日志所包含的内容。日志的设置不是单独提供字段,而是在一个长字段(有时很长)中列出操作。这段代码可以工作,我正在为查询的另一部分做类似的事情,我希望避免大量的替换语句,但至少我知道这会对您所做的工作起作用;我写了封信,谢谢。我问了同样的问题。不幸的是,我没有控制权,我只是对它提出质疑。谢谢你的回复,这听起来很有趣。
while @criteria like '%[0-9]Z%'
begin
select @criteria = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@criteria, '1z','1'), '2z', '2'), '3z','3'),'4z','4'),'5z','5'),'6z','6'),'7z','7'),'8z','8'),'9z','9'),'0z','0')
end

select @criteria