sql >> Base de Datos >  >> RDS >> Oracle

Cómo dividir una cadena en Oracle

Problema:

Quiere dividir una cadena en Oracle.

Ejemplo:

Tiene una oración y le gustaría dividirla por el carácter de espacio.

Solución:

SELECT
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts
FROM dual
CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;

La tabla de resultados se ve así:

partes
Un
ejemplo
frase.

Discusión:

Para obtener subcadenas de una cadena, puede usar la función REGEXP_SUBSTR() incorporada de Oracle. Se necesitan cuatro argumentos:

  • La cadena en la que se buscará una subcadena.
  • La expresión regular; es decir, el patrón que le gustaría encontrar.
  • La posición en la que le gustaría comenzar a buscar el patrón (el valor predeterminado es 1, lo que significa comenzar desde el principio de la cadena).
  • El número que especifica qué aparición de la subcadena coincidente le gustaría ver (el valor predeterminado es 1 , lo que significa que se debe mostrar la primera subcadena coincidente).

En nuestro ejemplo, la cadena a buscar es 'An example sentence. ' En la cadena, busca subcadenas que sean palabras, que definimos aquí como cualquier grupo de cualquier carácter excepto espacios. Por eso especificamos el patrón '[^ ]+ ', es decir, cualquier secuencia de caracteres que no sean espacios. [^ ] representa cualquier carácter excepto el espacio, y el + signo representa una o más apariciones de dichos caracteres. El tercer argumento debe ser el predeterminado (1 ), ya que desea buscar palabras en toda la cadena desde el principio. El último argumento es el más complicado:necesita que su valor cambie para que se busque cada cadena. Debería estar nivelado:una pseudocolumna disponible en consultas jerárquicas usando CONNECT BY – que, en nuestro caso, será igual al número de fila de la fila actual en el resultado cuando se usa CONNECT BY. Entonces, tienes:

REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)

Esta expresión debe seleccionarse de dual – una pseudotabla utilizada en Oracle cuando no selecciona de una tabla real. Entonces, deberías CONNECT BY el operador de consultas jerárquicas, con la condición de que la subcadena recuperada no sea NULL . La subcadena recuperada será NULL una vez que se hayan recuperado todas las palabras; la consulta jerárquica detendrá la ejecución. Entonces, tienes:

FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL

Puedes leer aquí sobre el nivel y CONECTAR POR.

Si desea dividir la cadena por algún otro delimitador, puede modificar fácilmente la consulta. Por ejemplo, si desea dividir la cadena por la coma, cambie '[^ ] +' a '[^,]+ '. Aquí hay una consulta de ejemplo:

SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts
FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;