Итак, мне было поручено преобразовать некоторый код 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" и без блоков begin / end, чтобы явно их упорядочить. Ничего из этого не было бы большим делом, если бы я мог на самом деле запустить код для тестирования и проверки, но, к сожалению, у меня нет среды для его тестирования, и при этом у меня нет вывода из предыдущего использования кода.
tl; dr: Кто-нибудь из вас, гуру T-SQL, знает, какому из двух приведенных выше утверждений он будет интерпретироваться и каково их правило с конфликтами сдвига / уменьшения в T- SQL? (Присоединить к первому утверждению «если», присоединить к последнему утверждению «если», выбрать один случайным образом?)
РЕДАКТИРОВАТЬ: Вот еще один забавный один несколько строк вниз.
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'