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
Otra posibilidad sería el uso de REGEXP_SUBSTR.
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