我需要根据范围将数字转换为另一个值:
即:
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内部的分析函数上使用函数?
答案 0 :(得分: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
答案 1 :(得分:1)
SQL服务器的设计使得在表上运行比其他任何东西都快 - 特别是当该表只有13行时。
答案 2 :(得分: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;