Digamos 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 devuelva la subcadena hasta el carácter de subrayado (_). Por ejemplo:
ABC
DEFGH
IJKLMNOP
La función SUBSTRING no parece estar a la altura de la tarea porque se basa 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 haría que esto funcione, ya que solo parece eliminar una cierta lista / conjunto de caracteres y en realidad solo estoy detrás de los caracteres que conducen al carácter subrayado.
instr
devuelve 0 si lo tieneINSTR('ABC/D', '_')
. Al final, tiene una subcadena de 0 a (0-1) que es nula. No está bien.Esto se puede hacer usando REGEXP_SUBSTR fácilmente.
Por favor use
donde STRING_EXAMPLE es su cadena.
Tratar:
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
Resolverá tu problema.
fuente
INSTR
solución funciona con la misma rapidez que laREGEXP
solución.Debe 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 instr
Documentación de Susbtr
fuente
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
es la respuesta correcta, según lo publicado por user1717270
Si lo usa
INSTR
, le dará la posición de una cadena que asume que contiene "_" en ella. ¿Y si no es así? Bueno, la respuesta será 0. Por lo tanto, cuando desee imprimir la cadena, imprimirá unNULL
. 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 desee imprimir "host". Bueno, conINSTR
él te dará unNULL
porque no encontró ningún ".", Es decir imprimirá de 0 a 0. ConREGEXP_SUBSTR
obtendrás 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
fuente
Otra posibilidad sería el uso de REGEXP_SUBSTR.
fuente
Recuerde esto si todas sus cadenas en la columna no tienen un guión bajo (... o si el valor nulo será la salida):
SELECT COALESCE (SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), "STRING_COLUMN") AS OUTPUT FROM DUAL
fuente
Para encontrar cualquier subcadena de una cadena grande:
Luego, para encontrar la cadena
'Ple'
deString_value
podemos hacer lo siguiente:select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
Encontrarás resultado:
Ple
fuente
En caso de que la posición de la cadena no sea fija, por debajo de la instrucción Select podemos obtener la salida esperada.
Estructura de la tabla ID VARCHAR2 (100 BYTE) CLIENT VARCHAR2 (4000 BYTE)
Data- ID CLIENTE
1001 {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"}
1002 {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"}
Requisito: busque la cadena "ClientId" en la columna CLIENTE y devuelva el valor correspondiente. Como de "clientId": "con-bjp" -> con-bjp (Salida esperada)
seleccione CLIENTE, substr (substr (CLIENT, instr (CLIENT, '"clientId": "') + length ('" clientId ":"')), 1, instr (substr (CLIENT, instr (CLIENT, '"clientId" : "') + length ('" clientId ":" ')),' "', 1) -1) cut_str de TEST_SC;
CLIENT cut_str ------------------------------------------------ ----------- ---------- {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"} con- bjp {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"} Test-Cust
fuente