2016-03-28 39 views
0

最接近的匹配值我有一個表具有以下值要獲得DB2 SQL

ACCNO     TEXT 
    -------------  ---------------- 
    8611004050001  internal payment 
    861100405000X  external payment 
    8611XXXXXXXXX  other payments 

假設如果accono爲8611004050002的話,我必須事先知情同意對外支付。 如果accno是8611211216223那麼我必須得到其他支付。

我需要得到最接近的匹配值是單個sql我已經嘗試過case語句它不工作。什麼是實現這一目標的有效方法。

普萊斯幫我

+0

...您的表的設計意味着一個多部分的鍵,這將違背推薦的最佳做法。至少,它還要求你知道密鑰的結構是重要的,這將是一個相關的問題。根據您的未來需求,更改設計可能是有保證的。 –

+0

這是要求,我不能改變設計.. 這張表就像一個控制表,基於這一行(accno),他們想要選擇一些值..我沒有給這裏完整的表結構 –

+0

我可以實現這個在程序中(使用循環和多個sql語句),但是如果我能夠在單個查詢中執行它,它將會提高性能。 –

回答

0

嗯,一種方法是使用一個巨大的case聲明。類似這樣的:

select t.* 
from t 
order by (case when accno = <accno> then 99 
       when left(accno, 15) = left(<accno>, 15) then 15 
       when left(accno, 14) = left(<accno>, 14) then 14 
       when left(accno, 13) = left(<accno>, 13) then 13 
       when left(accno, 12) = left(<accno>, 12) then 12 
       when left(accno, 11) = left(<accno>, 11) then 11 
       when left(accno, 10) = left(<accno>, 10) then 10 
       when left(accno, 9) = left(<accno>, 9) then 9 
       when left(accno, 8) = left(<accno>, 8) then 8 
       when left(accno, 7) = left(<accno>, 7) then 7 
       when left(accno, 6) = left(<accno>, 6) then 6 
       when left(accno, 5) = left(<accno>, 5) then 5 
       when left(accno, 4) = left(<accno>, 4) then 4 
       when left(accno, 3) = left(<accno>, 3) then 3 
       when left(accno, 2) = left(<accno>, 2) then 2 
       when left(accno, 1) = left(<accno>, 1) then 1 
       else 0 
      end) desc 
fetch first 1 row only; 
+0

:winces:...哎喲。但是,它可能(可能)會產生錯誤的結果:'87325XXXX'可能不應該被考慮用於'824119000'的賬戶。 –

+0

我曾嘗試類似。但它提供了不止一行....提取第一行可以給單行,但它檢查行逐行..假設如果表有100行,那麼這個查詢將檢查像每行12次。 –

+0

我想要類中的東西,如果它匹配,然後查詢應該停止..假如它找到完整的accno,那麼它應該停止那裏只有其他,那麼它應該匹配11個字符其他10個字符就像.. –