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')
这有什么逻辑吗?
我要做的是,在用''(空字符串)替换'{'后,我会验证字符串的长度.
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)
| 归档时间: |
|
| 查看次数: |
855 次 |
| 最近记录: |