所以我的任务是将一些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'
答案 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';
如果testvar
和testvar2
均为1,则输出“Got to 1”。
如果testvar=1
和testvar2=2
,则输出“已到2”。
如果testvar=2
,则没有输出。因此,else
与最近的if
答案 1 :(得分:1)
你的假设是正确的。
IF () IF () X ELSE Y
与IF () 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'