2

我有一个可能包含或不包含重复字母的字符串z。重复z's总是以数字开头。它被用作填充物。我遇到的问题是字符串可能包含z's前面没有数字的合法字母,所以我不能z's''.

这是一个示例:

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   '

结果应该是:

  Process Level = 31129     Process Level = 32045   Leader = Gail Zimmerman  Process Level >= 21 AND Process Level <= 25  Leader = John Schwartz   
4

2 回答 2

0

这是针对 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

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

于 2013-06-10T16:00:05.150 回答
0

愚蠢的问题; 为什么在世界上你会使用标准字符作为填充符?

无论如何...这有点令人费解,但您可以使用 REVERSE 函数将字符串向后翻转,使用 LEFT 函数修剪掉现在的 LEADING Z(与 TRAILING 相反),然后再次反转字符串。

完整的“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
于 2013-06-10T15:54:43.630 回答