用SUBSTRING和INSTRING解码?

时间:2014-04-01 16:24:58

标签: oracle

我有一个表,其中的城市列具有很少的记录,状态值也用逗号分隔。 还有其他记录。我想将当前值的状态值带到一个名为state的单独字段中。 怎么做?我尝试了下面的代码,它说“缺少右括号”:

SELECT  DECODE(ORA_CITY,
                 INSTR(ORA_CITY,',') > 0, 
                   SUBSTR(ORA_CITY, INSTR(ORA_CITY, ','), LENGTH(ORA_CITY) ) ,
                   NULL) AS STATE 
from ADDRESS 

3 个答案:

答案 0 :(得分:2)

我不知道你是否仍然需要它,但使用CASE:

SELECT CASE
     WHEN INSTR(ORA_CITY, '5') > 0 THEN
       SUBSTR(ORA_CITY, INSTR(ORA_CITY, '5'), LENGTH(ORA_CITY))
     ELSE
       NULL
   END STATE 
  FROM ADDRESS

答案 1 :(得分:0)

显然你还没有理解解码语法。

尝试以下方法:

SELECT  DECODE(INSTR(ORA_CITY,','), 
               0,
               NULL,
               SUBSTR(ORA_CITY, INSTR(ORA_CITY, ','), LENGTH(ORA_CITY) )) AS STATE 
FROM ADDRESS 

正确的语法是:

  

DECODE(表达,搜索,结果[,搜索,结果] ...... [,   默认]),其中

     

表达式是要比较的值。

     

搜索是与表达式进行比较的值。

     

结果是返回的值,如果表达式等于搜索。

     

默认是可选的。如果未找到匹配项,则DECODE函数将执行   返回默认值。如果省略default,那么DECODE函数将会   返回null(如果未找到匹配项)。

示例herehere

答案 2 :(得分:0)

SELECT REGEX_REPLACE(ORA_CITY, '.*, *', '') AS STATE
FROM ADDRESS
WHERE ORA_CITY LIKE '%,%'

这使用正则表达式替换所有逗号,然后可能没有任何空格。包括在哪里。