2010-04-12 132 views
0

的值,我需要一些轉換爲基於一系列另一個值:轉換基於範圍

即:

 
7 = "A" 
106 = "I" 

我有一系列這樣的:

 
from to  return-val 
1 17  A 
17 35  B 
35 38  C 
38 56  D 
56 72  E 
72 88  F 
88 98  G 
98 104 H 
104 115 I 
115 120 J 
120 123 K 
123 129 L 
129 infinity M 

這些值是固定的,不會改變。

我在想一個查找表是需要的,但有沒有一種方法可以用一個函數在oracle內部的分析函數中完成?

回答

4

想我會使用映射表:

映射

to ret 
17 A 
38 B 

Select Max(ret) 
From mapping 
Where x <= to 

你也使用CASE WHEN

Select Case When x <= 17 Then 'A' 
      When x <= 35 Then 'B' 
      When x <= 38 Then 'C' 
      ... 
      Else 'M' End 
From your_table 
+0

有點不好意思。我已經忘記了case語句 – Chris 2010-04-12 16:11:40

1

SQL服務器的設計,使得操作上表比其他任何事情都快 - 特別是當這張桌子只有13行時。

1

我會在oracle中創建一個函數,因爲它應該比查表更高效(不會往返磁盤往返)。

CREATE OR REPLACE Function ValueFromRange 
    (n IN number) 
    RETURN varchar2 
IS 
    ret varchar2; 
BEGIN 
ret := -1; -- UNDEFINED? 
IF n >= 1 and n <= 17 THEN 
    ret := 'A'; 
ELSIF n >= 18 and n <= 35 THEN 
    ret := 'B'; 
ELSIF n >= 36 and n <= 38 THEN 
    ret := 'C'; 
ELSIF n >= 39 and n <= 56 THEN 
    ret := 'D'; 
ELSIF n >= 57 and n <= 72 THEN 
    ret := 'E'; 
ELSIF n >= 73 and n <= 88 THEN 
    ret := 'F'; 
ELSIF n >= 89 and n <= 98 THEN 
    ret := 'G'; 
ELSIF n >= 99 and n <= 104 THEN 
    ret := 'H'; 
ELSIF n >= 105 and n <= 115 THEN 
    ret := 'I'; 
ELSIF n >= 116 and n <= 120 THEN 
    ret := 'J'; 
ELSIF n >= 121 and n <= 123 THEN 
    ret := 'K'; 
ELSIF n >= 124 and n <= 129 THEN 
    ret := 'L'; 
ELSIF n >= 130 THEN 
    ret := 'M'; 
END IF; 
RETURN ret; 

END; 
+0

難道你不認爲甲骨文將在RAM內存緩存這樣的小桌子嗎? – TTT 2010-04-13 04:48:10

+0

當然會。我認爲這樣做更合適。它在使用查詢恕我直言時甚至會更好看。 – 2010-04-13 11:46:11

+0

SQL和PL/SQL之間的上下文切換有性能損失。 – Theo 2010-04-15 09:15:14