2016-03-28 58 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个字符就像.. –