悬挂在T-SQL中的“else”解决方案

时间:2011-10-21 15:15:29

标签: sql tsql

所以我的任务是将一些T-SQL代码转换为C代码。谁写了我正在转换的代码沉溺于很少甚至没有代码礼仪。我知道这是因为完全缺乏评论,没有缩进,缺少开始/结束块,除非在绝对语法上是必要的(并且有一些是为了好的措施而随意抛出)。

这引发了一些问题。我正在转换的代码基于Metaphone算法。我说“基于”因为它有相当多的......“无证件改进”,这使得它与官方实施不同。因此,我不能只是去抓一些Metaphone实现,因为它实际上并不是一个“正确”的翻译。

所以这是问题的根源:

if @str1='d'
if substring(@str,@cnt,3) in ('dge','dgy','dgi')
set @Result=@Result + 'j'
else
set @Result=@Result + 't'

由于Metaphone的工作原理,我很确定他们的意思是:

if @str1='d'
    if substring(@str,@cnt,3) in ('dge','dgy','dgi')
        set @Result=@Result + 'j'
else
    set @Result=@Result + 't'

但我不确定它是否真的被解释为:

if @str1='d'
    if substring(@str,@cnt,3) in ('dge','dgy','dgi')
        set @Result=@Result + 'j'
    else
        set @Result=@Result + 't'

这个小片段并不算太大,但就在它之后,有一个部分有五个“if”语句和一个“else”语句,没有开始/结束块来明确排列它们。如果我真的可以运行代码来测试和查看,这一切都不是什么大问题,但遗憾的是,我没有测试它的环境,也没有以前使用代码的任何输出。

tl; dr:你们中的任何一位T-SQL专家都知道上面哪两个语句会被解释为什么,以及他们在T中的转移/减少冲突的规则是什么 - SQL? (附加到第一个“if”语句,附加到最后一个“if”语句,随机选择一个?)

编辑:这是另一个有趣的几行。

if @str1='t'
if substring(@str,@cnt,3) in ('tia','tio')
set @Result=@Result + 'x'
else
if @str2='th'
set @Result=@Result + '0'
else
if substring(@str,@cnt,3) <> 'tch'
set @Result=@Result + 't'

EDIT2:好的,如果我正确地阅读这些答案,那就意味着上面的内容实际上是

if @str1='t'
    if substring(@str,@cnt,3) in ('tia','tio')
        set @Result=@Result + 'x'
    else
        if @str2='th'
            set @Result=@Result + '0'
        else
            if substring(@str,@cnt,3) <> 'tch'
                set @Result=@Result + 't'

2 个答案:

答案 0 :(得分:2)

这是应该帮助你的东西

DECLARE @testvar INT;
DECLARE @testvar2 INT;
SET @testvar = 1;
SET @testvar2 = 1;

IF @testvar = 1
    IF @testvar2 = 1
        SELECT 'Got to 1';
    ELSE 
        SELECT 'Got to 2';

如果testvartestvar2均为1,则输出“Got to 1”。

如果testvar=1testvar2=2,则输出“已到2”。

如果testvar=2,则没有输出。因此,else与最近的if

配对

答案 1 :(得分:1)

你的假设是正确的。

IF () IF () X ELSE YIF () BEGIN IF () X ELSE Y END

无效

ELSE关键字回溯到同一范围内的最新IF语句。因此,要获得您的想法,您需要添加BEGIN和END语句......

IF (@str1='d')
  BEGIN
    IF (substring(@str,@cnt,3) in ('dge','dgy','dgi'))
      SET @Result=@Result + 'j'
  END
ELSE
  SET @Result=@Result + 't'