separar right regexp_substr instr ejemplos cadena sql oracle substring trim

right - ¿Cómo seleccionar una subcadena en Oracle SQL hasta un personaje específico?



split oracle (7)

El uso de una combinación de SUBSTR, INSTR y NVL (para cadenas sin guiones bajos) devolverá lo que desee:

SELECT NVL(SUBSTR(''ABC_blah'', 0, INSTR(''ABC_blah'', ''_'')-1), ''ABC_blah'') AS output FROM DUAL

Resultado:

output ------ ABC

Utilizar:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, ''_'')-1), t.column) AS output FROM YOUR_TABLE t

Referencia:

Apéndice

Si usa Oracle10g +, puede usar REGEXP_SUBSTR regulares a través de REGEXP_SUBSTR .

Supongamos que tengo una columna de tabla que tiene resultados como:

ABC_blahblahblah DEFGH_moreblahblahblah IJKLMNOP_moremoremoremore

Me gustaría poder escribir una consulta que seleccione esta columna de dicha tabla, pero solo devuelve la subcadena al carácter Subrayado (_). Por ejemplo:

ABC DEFGH IJKLMNOP

La función SUBSTRING no parece estar a la altura de la tarea porque está basada en la posición y la posición del guión bajo varía.

Pensé en la función TRIM (la función RTRIM específicamente):

SELECT RTRIM(''listofchars'' FROM somecolumn) FROM sometable

Pero no estoy seguro de cómo conseguiría que esto funcione, ya que solo parece eliminar una determinada lista / conjunto de caracteres y estoy realmente solo después de los personajes que conducen al carácter Subrayado.


Esto se puede hacer usando REGEXP_SUBSTR fácilmente.

Por favor use

REGEXP_SUBSTR(''STRING_EXAMPLE'',''[^_]+'',1,1)

donde STRING_EXAMPLE es tu cadena.

Tratar:

SELECT REGEXP_SUBSTR(''STRING_EXAMPLE'',''[^_]+'',1,1) from dual

Solucionará tu problema.


Necesitas obtener la posición del primer guión bajo (usando INSTR) y luego obtener la parte de la cadena desde el primer carácter hasta (pos-1) usando substr.

1 select ''ABC_blahblahblah'' test_string, 2 instr(''ABC_blahblahblah'',''_'',1,1) position_underscore, 3 substr(''ABC_blahblahblah'',1,instr(''ABC_blahblahblah'',''_'',1,1)-1) result 4* from dual SQL> / TEST_STRING POSITION_UNDERSCORE RES ---------------- ------------------ --- ABC_blahblahblah 4 ABC

Documentación de Instr

Susbtr Documentation



Para encontrar cualquier subcadena de una cadena grande:

string_value:=(''This is String,Please search string ''Ple'');

Luego, para encontrar la cadena ''Ple'' de String_value , podemos hacer lo siguiente:

select substr(string_value,instr(string_value,''Ple''),length(''Ple'')) from dual;

Encontrará el resultado: Ple


Recuerde esto si todas sus cadenas en la columna no tienen un guión bajo (... o si el resultado es un valor nulo):

SELECT COALESCE (SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", ''_'')-1), "STRING_COLUMN") AS OUTPUT FROM DUAL


SELECT REGEXP_SUBSTR(''STRING_EXAMPLE'',''[^_]+'',1,1) from dual

es la respuesta correcta, según lo publicado por el usuario1717270

Si usa INSTR , le dará la posición para una cadena que asume que contiene "_" en ella. ¿Qué pasa si no? Bueno, la respuesta será 0. Por lo tanto, cuando quiera imprimir la cadena, imprimirá un NULL . Ejemplo: si desea eliminar el dominio de un "host.domain". En algunos casos, solo tendrá el nombre corto, es decir, "host". Lo más probable es que le gustaría imprimir "host". Bueno, con INSTR le dará un NULL porque no encontró ningún ".", Es decir, imprimirá de 0 a 0. Con REGEXP_SUBSTR obtendrá la respuesta correcta en todos los casos:

SELECT REGEXP_SUBSTR(''HOST.DOMAIN'',''[^.]+'',1,1) from dual;

ANFITRIÓN

y

SELECT REGEXP_SUBSTR(''HOST'',''[^.]+'',1,1) from dual;

ANFITRIÓN