Oracle 11g中的字符串操作

时间:2013-09-09 04:07:52

标签: oracle oracle11g

我目前正在进行一项练习,该练习将根据存储在列中的一系列字符显示某个文本,例如TESTTEMP。字符串示例:

PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348

现在我需要的是通过字符串TESTTEMP|;之前提取文本。我做的是我提取了TESTTEMP|以后的所有文本,然后得到前两个字符。不幸的是,这是不可能的,因为在TESTTEMP|有3个字符的情况下。有没有办法让我能够做到这一点?以下是我到目前为止:

SELECT 
  SUBSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), 1, 2) invalue
FROM
(
  SELECT 
    'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' VALUE 
  FROM dual
)t;

1 个答案:

答案 0 :(得分:1)

找到索引;在子字符串中并使用它作为索引而不是硬编码为2.

SELECT 
  SUBSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), 1, INSTR(SUBSTR(value, INSTR(value, ';TESTTEMP|')+10), ';')-1) invalue
FROM
(
  SELECT 
    'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348' VALUE 
  FROM dual
)t;

如果看起来很乱,你甚至可以像这样写

SELECT
  SUBSTR(VALUE, 1, INSTR(VALUE, ';') - 1) invalue
FROM
(
  SELECT
     SUBSTR(VALUE, INSTR(VALUE, ';TESTTEMP|') + 10)
     VALUE
  FROM (
      SELECT
         'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348'
         VALUE
      FROM dual) t
)t;

根据评论 - 如果您想知道是否找到字符串,请使用此查询。如果找到字符串,FOUND将大于0。

SELECT
  SUBSTR(VALUE, 1, INSTR(VALUE, ';')-1) invalue, FOUND
FROM
(
  SELECT
     SUBSTR(VALUE, INSTR(VALUE, SEARCHSTRING)+10) VALUE, INSTR(VALUE, SEARCHSTRING) FOUND
  FROM (
      SELECT
         'PROGRAMNAME|MAX2112ETI_L;PROGRAMREV|L;TESTOPTION|FR;TESTTEMP|25;STD IPH|528.63436123348'
         VALUE,
         ';TESTTEMP|' SEARCHSTRING
      FROM dual) t
)t;