Volver a la lista de artículos Artículos
Lectura de 4 minutos

Cómo dibujar un árbol de Navidad en SQL

Puede utilizar SQL para manipular todo tipo de datos, desde enormes consultas analíticas hasta breves sentencias de propósito único. Pero también puede utilizar SQL simplemente para divertirse, sin que ningún requisito empresarial reprima su creatividad. Así pues, saque su sombrero alegre y prepárese para cantar "O Christmas Tree" mientras creamos un arte extravagante con el viejo SQL.

Hoy vamos a generar algo de arte ASCII con temática navideña, sólo por diversión. Así es. He dicho diversión. Este ejercicio no tiene ningún valor comercial. Si está buscando ayudar a su empresa de alguna manera, excepto quizás siendo un empleado alegre, será mejor que se vaya, porque estamos aquí para poner nuestras habilidades SQL a la última prueba: dibujar árboles de Navidad. Para participar en esta actividad festiva, tendrá que dominar algunos conocimientos básicos de SQL. Es de esperar que hayas aprendido lo siguiente:

    • Funciones de cadena SQL básicas
    • CTEs
    • Recurrencia

Nos basaremos en estos tres elementos para crear objetos interesantes en SQL.

Números aburridos

Antes de que podamos llegar a lo más divertido, tenemos que aprender lo básico. Nos gustaría generar algunos números para calentarnos. Hay muchas maneras de generar números en SQL, la más común es la recursión. Siguiendo un simple patrón, puedes producir un montón de números.

Para generar un simple conjunto de datos de 10 números, podemos escribir el siguiente CTE corto take10:

WITH take10(list_of_numbers) AS 
(SELECT 0 FROM DUAL
  UNION ALL 
 SELECT 
  list_of_numbers+1 
  FROM take10
  WHERE list_of_numbers < 10)
SELECT * FROM take10;

Este es el conjunto de resultados :

list_of_numbers
0
1
2
3
4
5
6
7
8
9
10

Nota: Estoy usando Oracle SQL para demostrar los generadores, de ahí el uso de la tabla doble. Si estás usando PostgreSQL o MySQL, una simple cláusula SELECT N sin la cláusula FROM será suficiente.

Plantar un árbol

Muy bien, basta de hablar de números - ¡es hora de un poco de magia navideña! Realmente me gustaría tener un bonito árbol de Navidad para decorar mi IDE [Entorno de Desarrollo Integrado] de SQL y mantenerme alegre durante esta temporada sombría. Para generar un árbol, necesitaremos aprovechar las funciones de cadena de SQL, que espero que hayas practicado en LearnSQL.es.

Construiremos nuestro árbol usando pinos y una cierta profundidad de árbol:

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,rpad(' ',10,' ') || '*' pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Para nuestro conjunto de resultados, obtenemos este bonito árbol de Navidad:

          *
         *.*
        *...*
       *.....*
      *.......*
     *.........*
    *...........*
   *.............*
  *...............*
 *.................*

Si quieres personalizar tu árbol, simplemente cambia los símbolos que utilizas para los pinos. Si sustituimos nuestros pinos por asteriscos:

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,rpad(' ',10,' ') || '.' pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('.',small_tree.tree_depth+1,'*') || lpad('.',small_tree.tree_depth,'*') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Obtendremos un árbol diferente:

          .
         .*.
        .***.
       .*****.
      .*******.
     .*********.
    .***********.
   .*************.
  .***************.
 .*****************.

Si tenemos un ánimo verdaderamente festivo, podemos generar

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,
  rpad(' ',10,' ') || '*' 
  || rpad(' ',20,' ') || '*' 
  || rpad(' ',20,' ') || '*' 
  pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') 
  || rpad(' ',20-small_tree.tree_depth-tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') 
  || rpad(' ',20-small_tree.tree_depth-tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Un bosque entero de árboles:

          *                    *                    *
         *.*                  *.*                  *.*
        *...*                *...*                *...*
       *.....*              *.....*              *.....*
      *.......*            *.......*            *.......*
     *.........*          *.........*          *.........*
    *...........*        *...........*        *...........*
   *.............*      *.............*      *.............*
  *...............*    *...............*    *...............*
 *.................*  *.................*  *.................*

¡Pero a nuestros árboles les faltan algunos tocones! Te dejo ese reto a ti, querido lector. Y ya que estamos, genera unas bonitas estrellas y adornos, ¡sé creativo! Cuando utilizas la recursividad en SQL, el único límite al que te enfrentas es tu imaginación. ¡Felices y festivas fiestas de parte de la familia LearnSQL.es!