SQL – Dividir una línea de texto en dos, haciendo coincidir la división con un espacio entre palabras

A veces puede ser necesario que queramos hacer una sentencia SQL que nos devuelva una línea dividida en dos cuando el texto excede una determinada longitud (y que la segunda línea esté en blanco cuando el texto simplemente es más corto de dicha longitud).

Por ejemplo, en un informe queremos imprimir el nombre de una obra. En vez de usar un control multilínea, que solo se puede alinear a la izquierda o derecha, queremos colocar dos controles simples (que podemos alinear centrados) cuando el nombre de la obra tenga más de 65 caracteres.

Si usamos un control multilinea la consulta es muy sencilla:

SELECT
O.DESCRIPCION
FROM T_OBRAS O ….

Sin embargo, el control multilinea no nos vale en este caso ya que queremos opciones avanzadas que solo están disponibles en un control sin saltos de línea. Entonces podemos obtener el valor de la línea 1, con los primeras 65 caracteres (en realidad menos, ya que buscaremos un espacio para hacer el salto de línea) y una segunda línea con el resto del nombre de la obra:

SELECT
,LTRIM(RTRIM( LEFT(O.DESCRIPCION, 65-CHARINDEX(' ',REVERSE(LEFT(O.DESCRIPCION,65))) ))) DESCRIPCION1
,LTRIM(RTRIM( SUBSTRING( O.DESCRIPCION , 65-CHARINDEX(' ',REVERSE(LEFT(O.DESCRIPCION,65)))+1,LEN(O.DESCRIPCION) ))) DESCRIPCION2
FROM T_OBRAS O ….

En la sentencia podemos sustituir 65 por otra longitud, y ‘ ‘ (dentro del CHARINDEX) por otro carácter que fuerce el salto de línea.

La única complicación es buscar el INDICE DEL ÚLTIMO ESPACIO dentro de los primeros 65 caracteres.

Para buscar por el final en vez de por el principio, aplicamos REVERSE a la cadena, y el valor buscado será 65-CHARINDEX(‘ ‘,deLaCadenaReversa)

Una vez que tenemos el índice del espacio donde aplicar el salto, lo demás es trivial gracias a las funciones LEFT y SUBSTRING:

  • Descripción 1: LEFT( texto, indice)
  • Descripción 2: SUBSTRING( texto, indice, len(texto))