Повисшее «остальное» разрешение в T-SQL - PullRequest
3 голосов
/ 21 октября 2011

Итак, мне было поручено преобразовать некоторый код 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'

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Вот кое-что, что должно вам помочь

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, выводится «Got to 2».

Если testvar=2, выход не выводится.Таким образом, else становится парным против ближайшего if

1 голос
/ 21 октября 2011

Ваше предположение верно.

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...