2011-10-21 14 views
3

私はT-SQLコードをCコードに変換することを任されています。コードを書いた人は誰も私が少しでもコード礼儀に惑わしていることに変わります。私は、完全に文法的に必要な場合を除いて、コメントの完全な不足、インデントの欠如、および開始/終了ブロックの欠如のためにこれを知っています。T-SQLの "else"解決策をダック

これは、いくつかの問題を引き起こします。私が変換しているコードは、メタフォンのアルゴリズムに基づいています。私は「ベース」と言います。これは正式な実装とは異なる、かなりの数の「文書化されていない改善」があるためです。このため、実際には「正しい」翻訳ではないため、Metaphone実装を手に入れることはできません。

ので、ここでの問題(複数可)のルートです:私は、彼らが意図かなり確信している、そのためMetaphoneのがどのように動作するかの

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

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

しかし、私はもしわかりません

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

この小さなスニペットは、取引の大きすぎるではありませんが、その直後、sectioあります:それは実際にあると解釈されています5つの "if"ステートメントと1つの "else"ステートメントのみで、明示的に配置するための開始/終了ブロックはありません。実際にテストして見るためにコードを実行できるのであれば、これは大きな問題ではありませんが、悲しいことに、私はそれをテストする環境がなく、コードの以前の使い方の出力もありません。

TL; DR:は、あなたがたのうち、T-SQLの達人そこにそれがあると解釈されますとシフトして、それらのルールは何上記の二つの文のどの知っていますか/ T-SQLでの競合を減らしますか? (最初の "if"ステートメントに付け加えて、最後の "if"ステートメントに付け加えて、ランダムに1つを選んでください)

EDIT:もう少し楽しいです。

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

EDIT2:私が正しくこれらの答えを読んでいる場合は[OK]を、上記の意味ここでは、実際に

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

おそらくSQL ServerのT-SQLコードであり、OracleのPL/SQLコードではありません。説明を変更してタグを修正してください。 – Codo

+0

ヘッドアップありがとう。それを私に割り当てた人は、それがPLSQLだと言っていましたが、確認することは決してありませんでした。私はどちらかに経験がなく、それが読みやすいので、私は確かに検証することを心配しませんでした。 –

+0

また、 "shift/reduce"は実際に質問を記述していません。代わりに "T-SQL if/else nesting question"を試してください。 –

答えて

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の場合、「1にする」を出力します。

testvar=1testvar2=2の場合、「Got to 2」を出力します。

testvar=2の場合、出力はありません。したがって、elseは最も近いものとペアになっていますif

+0

いいえ、それはありません! 'Got to 1'を出力します! – JonH

+0

ありがとう、ありがとう。 – dsolimano

1

あなたの仮定は正しいです。

IF() IF() X ELSE Yは、IF文ELSEキーワードが同じスコープで最も最近に振り返るIF() BEGIN IF() X ELSE Y END

にequivilentです。あなたが意図したと思うものを得るには、BEGIN文とEND文を追加する必要があります...

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

説明のためにBegin/Endブロックを含めてくれてありがとう。 –

関連する問題