Oracle 使用substr时的多个案例

Oracle 使用substr时的多个案例,oracle,case,substr,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

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

我认为我的First substr是错误的,因为它给我的是oracleDB1而不是仅仅DB1,请有人纠正一下处理这个问题的方法吗?

您目前正在做:

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

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

substr(value, 7, instr(value, ' ') - 1)
然后,您将看到从位置1开始的9个字符,即
DB1(LOCA
。请记住,它不是结束位置。因此,现在您需要再次考虑固定
oracle
部分的长度,并将您要查找的长度减少该数量:

substr(value, 7, instr(value, ' ') - 7)
或者详细说明值的来源:

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

第一个substr总是从字符1开始,而不是在“oracle”部分之后;相似的条件两端都是通配符,所以您是否也希望看到更复杂的东西,比如“x oracleDB3 y”?为什么第二个substr具有instr调用,而不是固定的值5?您真的想要五个字符,还是所有的字符g到第一个/?谢谢Alex,对于第一个substr,我尝试从第7个字符开始,直到它到达空白样本数据“oracleDB1(local x)”,对于第二个substr,我想我可以使用substr(value,1,5)好的,但是你现在从第一个字符开始,因为你给了第二个参数1而不是7?哦,是的,更新为7,我如何限制到空的空间?目前它一直持续到最后,得到“DB1(LOCA)”而不是“DB1”您在
值v
后还缺少一个逗号。太好了…像charm一样工作,您能在select子句中建议正确的使用case的方法吗,尝试了不同的变体,但似乎对case不起作用…什么时候…然后..其他?谢谢,让它工作了,,更新了原始请求,以便其他人可以使用它。这样更改问题没有帮助现在看起来好像从来没有出现过问题…我的错,我会记住以后不要这样做。