oracle - 带有 substr 的多个 CASE/WHEN

标签 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

我认为我的第一个子字符串是错误的,因为它给了我 oracleDB1 而不仅仅是 DB1,有人可以请正确的方法来处理这个问题吗?

最佳答案

您目前正在做的事情:

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))

关于oracle - 带有 substr 的多个 CASE/WHEN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150617/

相关文章:

sql - (Oracle) 将日期字符串转换为日期时间

sql - 如何导出 Oracle 统计信息

sql - 如何在表格中找到一系列没有间隙的序列号

MySQL 子查询、别名、表连接查询的计算

mysql 条件查询内连接

php - Foreach strpos问题。在另一个字符串中查找字符串

mysql - 计算 Oracle 表中特定值之间模式的出现次数

mysql - 带子查询的连接表中的用例

javascript - String.slice 和 String.substring 有什么区别?

hash - 子字符串 md5 碰撞