gpt4 book ai didi

sql - 在 SQL 中的字符串中查找不匹配的大括号

转载 作者:行者123 更新时间:2023-12-04 20:43:55 25 4
gpt4 key购买 nike

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

DECLARE @iVariable varchar(100)
SET iVariable = '{Day}{Month}{Year}'

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

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

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

这样做有什么逻辑吗?

最佳答案

我要做的是在将 '{' 替换为 ''(空字符串)后验证字符串的长度。

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 在评论中所说,这不适用于例如“{}}{”。

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

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

关于sql - 在 SQL 中的字符串中查找不匹配的大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com