Estoy consultando un conjunto de datos usando Oracle SQL Developer y quiero crear una columna con datos de retorno parcial de un (CLOB) en otra columna.

La parte que necesito está entre comillas y he usado la subcadena para extraer, sin embargo, el valor cambiará al igual que la longitud de la cadena. ¿Hay alguna manera de finalizar cuando se alcanzan las comillas de cierre en lugar de especificar la longitud de la cadena?

dbms_lob.substr(a.LINETESTRESULT,15,dbms_lob.instr(UPPER(a.LINETESTRESULT),'LHCRAG')+11) AS REFRESH_RAG

Por el momento, se devuelven 15 caracteres, pero las últimas incorporaciones son más cortas y muestran el ", de la siguiente entrada. Necesito reemplazar el atributo de longitud.

El resultado que obtengo es:

Red_Session ",

Necesito que la salida sea: Red_Session

O sea cual sea el valor de retorno, solo necesito que finalice antes de la cotización de cierre.

2
djd 9 may. 2019 a las 15:13

3 respuestas

La mejor respuesta

INSTR tiene un parámetro nth (Número de ocurrencia, comenzando en 1.). Con esto puedes crear algo como esto.

dbms_lob.substr(a.LINETESTRESULT,dbms_lob.instr(a.LINETESTRESULT, '"', 1, 2) - dbms_lob.instr(a.LINETESTRESULT, '"') - 1, dbms_lob.instr(a.LINETESTRESULT, '"') + 1) AS REFRESH_RAG
2
RGruca 9 may. 2019 a las 12:33

Puedes probar REGEXP_SUBSTR como a continuación. Alternativamente, puede encontrar la posición de la cotización y utilizar el substr ...

SELECT
  REGEXP_SUBSTR(a.LINETESTRESULT,
                '"([^"]*)') AS REFRESH_RAG
  FROM DUAL;
1
Dr Phil 9 may. 2019 a las 12:19

Logré obtener esto usando el siguiente código:

SELECT
dbms_lob.substr(UPPER(a.LINETESTRESULT), dbms_lob.instr(UPPER(a.LINETESTRESULT), '"', 
dbms_lob.instr(UPPER(a.LINETESTRESULT), 'LHCRAG') + 11) - 
(dbms_lob.instr(UPPER(a.LINETESTRESULT), 'LHCRAG') + 11), 
dbms_lob.instr(UPPER(a.LINETESTRESULT), 'LHCRAG') + 11)
AS REFRESH_RAG
0
djd 9 may. 2019 a las 14:05