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

在SQL中的字符串中查找不匹配的花括号,sql,sql-server,logic,varchar,Sql,Sql Server,Logic,Varchar,如何在SQL中的字符串中找到不匹配的花括号 DECLARE @iVariable varchar(100) SET iVariable = '{Day}{Month}{Year}' 如果找到任何不匹配的左括号{Day}{Month{Year},则应返回“unmatched{” 否则,找到的任何不匹配右括号{Day}{Month}Year}应返回“unmatched}” 如果没有不匹配的括号,则应以逗号分隔的格式返回值,例如“日、月、年” 有什么逻辑可以这样做吗?我要做的是在用空字符串替换“{”

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

DECLARE @iVariable varchar(100)
SET iVariable = '{Day}{Month}{Year}'
如果找到任何不匹配的左括号{Day}{Month{Year},则应返回“unmatched{”

否则,找到的任何不匹配右括号{Day}{Month}Year}应返回“unmatched}”

如果没有不匹配的括号,则应以逗号分隔的格式返回值,例如“日、月、年”


有什么逻辑可以这样做吗?

我要做的是在用空字符串替换“{”之后验证字符串的长度

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
结果:

Day,Month,Year
Unmatched }
Unmatched {
No data present
No data present
Non matching pair

也许有一种更优雅的方法可以做到这一点,但以下应涵盖所有情况:

with v as (
      select '{Day}{Month}{Year}' as var union all
      select '{Day}{Month}{Year}}{' union all
      select '{Day}{Month}{Year}}}'
     ),
     cte as (
      select left(var, 1) as c, 1 as num, var
      from v
      union all
      select substring(var, num+1, 1), num + 1, var
      from cte
      where num <= len(var)
     ) 
select var,
       (case when min(balance) < 0 then 'Unbalanced }'
             when sum(case when c = '{' then 1
                           when c = '}' then -1
                           else 0
                      end) > 0
             then 'Unbalanced {'
             else 'Balanced'
       end)
from (select cte.*,
             (select sum(case when c = '{' then 1
                              when c = '}' then -1
                              else 0
                         end)
              from cte cte2
              where cte2.var = cte.var and cte2.num <= cte.num
             ) as balance
      from cte
     ) t
group by var;

这将逐个字符分解值,然后检查余额。

您使用的是什么数据库?@Gordon-SQL Server 2008
Day,Month,Year
Unmatched }
Unmatched {
No data present
No data present
Non matching pair
with v as (
      select '{Day}{Month}{Year}' as var union all
      select '{Day}{Month}{Year}}{' union all
      select '{Day}{Month}{Year}}}'
     ),
     cte as (
      select left(var, 1) as c, 1 as num, var
      from v
      union all
      select substring(var, num+1, 1), num + 1, var
      from cte
      where num <= len(var)
     ) 
select var,
       (case when min(balance) < 0 then 'Unbalanced }'
             when sum(case when c = '{' then 1
                           when c = '}' then -1
                           else 0
                      end) > 0
             then 'Unbalanced {'
             else 'Balanced'
       end)
from (select cte.*,
             (select sum(case when c = '{' then 1
                              when c = '}' then -1
                              else 0
                         end)
              from cte cte2
              where cte2.var = cte.var and cte2.num <= cte.num
             ) as balance
      from cte
     ) t
group by var;