【问题标题】:Multiple CASE/WHEN with substr多个 CASE/WHEN 与 substr
【发布时间】:2015-03-19 16:58:34
【问题描述】:

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

【问题讨论】:

  • 那么你的第一个 substr 总是从字符 1 开始,而不是在 'oracle' 部分之后;不过,您的相似条件在两端都是通配符,所以您是否也期待更复杂的东西,例如“x oracleDB3 y”?为什么你的第二个 substr 有 instr 调用,而不是固定值 5?你真的想要五个字符,还是第一个 / 之前的所有字符?
  • 感谢 Alex,对于第一个 substr,我尝试从第 7 个字符开始,直到它到达空白空间样本数据“oracleDB1 (local x)”,对于第二个 substr,我想我可以使用 substr(value, 1,5)
  • 好的,但是您当前是从第一个字符开始的,因为您将第二个参数指定为 1 而不是 7?
  • 哦,是的,已将其更新为 7,如何限制到空白空间?目前它一直持续到最后,得到“DB1(LOCA”而不是“DB1”
  • value v 后面也少了一个逗号。

标签: oracle case substr


【解决方案1】:

你目前正在做:

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

【讨论】:

  • great... 像魅力一样工作,您能否建议在 select 子句中使用 case 的正确方法,尝试了不同的变体,但似乎没有任何东西适用于 case...when ... then .. else ?
  • 谢谢,让它工作,更新原始请求,以便其他人可以使用它。
  • 这样改变问题没有帮助 - 现在看起来好像从来没有问题......
  • 我的错,以后记得不要做。
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多