注意:这是最终答案,理想情况下我们不应该更新原始问题,感谢 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/