多个CASE / WHEN with substr

时间:2015-03-19 16:58:34

标签: oracle case substr

注意:这是最终答案,理想情况下我们不应该更新原始问题,谢谢Alex P指出。

我们如何使用多个案例...在Oracle中使用substr时?

Table (T1):
Hostname  Value
H1        oracleDB1 (local x)
H2        oracleDB2 (local y)
H3        congo/db/abc
H4        congo/db/def
H5        other/rsync

Query: *SELECT hostname, 
           CASE
           WHEN value like ('%oracle%')
           THEN substr(value, 7,instr(value, ' ')-7)  // get value = DB1, DB2..
           WHEN value like ('%congo%')
           THEN value = 'congo'                      //get value = congo
           ELSE
           substr(value, 1,5)  // get first 5 character
           END AS value
        FROM T1;*

Expected Result:
H1   DB1
H2   DB2
H3   congo
H4   congo
H5   other

我认为我的拳头substr是错误的,因为它给了我oracleDB1而不仅仅是DB1,有人可以正确处理这个吗?

1 个答案:

答案 0 :(得分:2)

你现在正在做:

substr(value, 1, instr(value, ' ') - 1)

它为您提供从第一个字符开始的子字符串,长度为instr(value, ' '), - 1个字符。因此对于oracleDB1 (local x),第一个空格是字符10,所以你从位置1开始得到9个字符。

如果您只是将起始位置更改为7以跳过固定的'oracle'部分:

substr(value, 7, instr(value, ' ') - 1)

然后你将从位置1开始的9个字符,即DB1 (LOCA。记住the third argument is the length,它不是最终位置。所以现在你需要再次考虑固定oracle部分的长度,并减少你所寻找的长度:

substr(value, 7, instr(value, ' ') - 7)

或者说明价值来自哪里:

substr(value, length('oracle') + 1, instr(value, ' ') - (length('oracle') + 1))