2011-10-21 36 views
3

所以我一直在負責一些T-SQL代碼轉換爲C代碼。誰寫的代碼,我轉換沉迷於從小到沒有代碼禮節。我知道這是因爲完全沒有評論,缺乏壓痕,缺乏開始,除非絕對必要的語法(和一些扔在任意的好辦法)/結束塊。晃晃悠悠的「其他」分辨率

這引發了一些問題。我正在轉換的代碼基於Metaphone算法。我說「基於」,因爲它有很多......「無證的改進」,這使得它與官方實施有所不同。正因爲如此,我不能只是去抓住一些音位實現,因爲那就不是實際上是一個「正確」的翻譯。

所以這裏的問題(S)的根:

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 n有五個「if」語句並且只有一個「else」語句並且沒有開始/結束塊來明確地排列它們。這一切都不是什麼大不了的事,如果我能實際運行的代碼來測試看看,但可悲的是,我沒有一個環境來測試它,我也不具有從代碼的前面使用任何輸出。

TL;博士:做任何你T-SQL大師那裏知道了上述兩種說法的,它會被解釋爲,什麼是他們的輪班規則/減少T-SQL的衝突? (附加到第一個「如果」的聲明,附上最後的「如果」聲明,隨機挑選一個?)

編輯:這是另一個有趣的幾行。

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:好吧,如果我正確地閱讀這些答案,這意味着上述實際上是

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嵌套問題」。 –

回答

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被equivilent到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 @[email protected] + 'j' 
    END 
ELSE 
    SET @[email protected] + 't' 
+0

感謝您在此處包含開始/結束塊以進行澄清。 –