多个 CASE/WHEN 与 substr

Multiple CASE/WHEN with 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

我认为我的 fist substr 是错误的,因为它给我的是 oracleDB1 而不是 DB1,有人可以正确地处理这个问题吗?

您目前正在做:

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

它为您提供从第一个字符开始的子字符串,长度为 instr(value, ' '), - 1 个字符。因此对于 oracleDB1 (local x),第一个 space 是字符 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))