在SQL中的字符串中查找不匹配的花括号

Har*_*ari 3 sql sql-server logic varchar

如何在SQL中的字符串中找到无法匹配的花括号?

DECLARE @iVariable varchar(100)
SET iVariable = '{Day}{Month}{Year}'
Run Code Online (Sandbox Code Playgroud)

如果找到任何不匹配的左括号({Day} {Month {Year}),则应返回'Unmatched { '

否则找到任何无法匹配的右括号({Day} {Month} Year})然后应返回' Unmatched} '

如果没有不匹配的括号,则以逗号分隔格式返回值,例如('Day,Month,Year')

这有什么逻辑吗?

Gun*_*sen 5

我要做的是,在用''(空字符串)替换'{'后,我会验证字符串的长度.

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
Run Code Online (Sandbox Code Playgroud)

这里发生的是我检查是否有更多'}'而不是'{',它会返回不匹配的'}'.同样适用于'}'.

如果数字匹配,则返回原始字符串,替换为"{"和"}",然后插入逗号.

编辑:正如戈登在评论中所说,这不适用于例如'{}} {'.

相反,您可以使用用户定义的函数.例如:

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
Run Code Online (Sandbox Code Playgroud)

使用这些输入值进行测试:

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{')
Run Code Online (Sandbox Code Playgroud)

结果:

Day,Month,Year
Unmatched }
Unmatched {
No data present
No data present
Non matching pair
Run Code Online (Sandbox Code Playgroud)