我要做的是在用 ''(空字符串)替换 '{' 后验证字符串的长度。
DECLARE @iVariable varchar(100) = '{Day}{Month}{Year}'
select case
when len(@iVariable) - len(replace(@iVariable, '{', '')) < len(@iVariable) - len(replace(@iVariable, '}', ''))
then 'Unmatched }'
when len(@iVariable) - len(replace(@iVariable, '{', '')) > len(@iVariable) - len(replace(@iVariable, '}', ''))
then 'Unmatched {'
else right(replace(replace(@iVariable, '{', ','), '}', ''), len(replace(replace(@iVariable, '{', ','), '}', '')) - 1)
end
这里发生的情况是我检查'}'是否比'{'多,它返回不匹配的'}'。
'}' 也是如此。
如果数字匹配,则返回原始字符串,替换掉“{”和“}”,并插入逗号。
编辑:正如 Gordon 在 cmets 中所说,这不适用于例如“{}}{”。
相反,您可以使用用户定义的函数。例如:
create function SomeFunc(@iVariable varchar(2000))
returns varchar(3000)
as
begin
if len(replace(replace(@iVariable, '}', ''), '{', '')) = 0
return 'No data present'
else
begin
-- Declare stuff to be used
declare @result varchar(3000) = ''
declare @AMT_Left int = len(@iVariable) - len(replace(@iVariable, '{', ''))
declare @AMT_Right int = len(@iVariable) - len(replace(@iVariable, '}', ''))
-- First test if no. of brackets match:
if @AMT_Left > @AMT_Right
set @result = 'Unmatched }'
else if @AMT_Left < @AMT_Right
set @result = 'Unmatched {'
else if @AMT_Left = @AMT_Right
begin
-- If matched, define result, and use while loop for error handling
set @result = right(replace(replace(@iVariable, '{', ','), '}', ''), len(replace(replace(@iVariable, '{', ','), '}', '')) - 1)
DECLARE @intFlag INT
SET @intFlag = 1
-- Loop through each set and check if '{' occurs before '}':
WHILE (@intFlag <= @AMT_Left and @result != 'Non matching pair')
BEGIN
if charindex('{', @iVariable) > charindex('}', @iVariable)
set @result = 'Non matching pair'
set @iVariable = right(@iVariable, len(@iVariable) - charindex('}', @iVariable))
SET @intFlag = @intFlag + 1
end
end
end
return @result
end;
go
使用这些输入值进行测试:
select dbo.SomeFunc('{Day}{Month}{Year}')
select dbo.SomeFunc('{Day}{Month{Year}')
select dbo.SomeFunc('{Day}{Month}Year}')
select dbo.SomeFunc('{}{}')
select dbo.SomeFunc('{}}{')
select dbo.SomeFunc('{Day}}Month{')
结果:
Day,Month,Year
Unmatched }
Unmatched {
No data present
No data present
Non matching pair