注意:这是最终答案,理想情况下我们不应该更新原始问题,谢谢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,有人可以正确处理这个吗?
答案 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))