SQL ORACLE SELECT CASE和NVL

时间:2017-11-30 20:58:05

标签: sql oracle

我想问一下如何在一个Statement中使用NVL和CASE。

SELECT case 
          when column1 like '% =' then replace(column1,' =','=') 
          else column1 
       end 
from table;

SELECT nvl(SUBSTR(column1, INSTR(column1, 'text1') +3, 
           INSTR(column1, 'text2')-(INSTR(column1, ':text1')+4)),'Default') 
from table;

我想要的是使用select语句的输出作为nvl语句中的column1。

2 个答案:

答案 0 :(得分:1)

也许您可以使用子选择:

SELECT nvl(SUBSTR(column2, INSTR(column2, 'text1') +3, 
           INSTR(column2, 'text2')-(INSTR(column2, ':text1')+4)),'Default') 
from 
(
SELECT case 
          when column1 like '% =' then replace(column1,' =','=') 
          else column1 
       end column2
from test);

答案 1 :(得分:0)

除非你担心字符串末尾没有出现等号的字符串,否则我不会理解案例陈述,如果你担心这一点,我会推荐REGEXP_REPLACE函数代替。以下函数只删除存储在column1中的终止等号前面的单个空格:

REGEXP_REPLACE(column1,' =$','=')

然后将上述函数放在select语句中出现column1的任何位置。

select COALESCE( SUBSTR( REGEXP_REPLACE(column1,' =$','=')
                       , INSTR(REGEXP_REPLACE(column1,' =$','='), 'text1')+3
                       , INSTR(REGEXP_REPLACE(column1,' =$','='), 'text2')
                       -(INSTR(REGEXP_REPLACE(column1,' =$','='), ':text1')+4))
               , 'Default')
 from table;