在SQL中的字符串中查找不匹配的花括号
如何在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}” 如果没有不匹配的括号,则应以逗号分隔的格式返回值,例如“日、月、年” 有什么逻辑可以这样做吗?我要做的是在用空字符串替换“{”
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;