Last Updated on 31 Dicembre 2021 by Roberto De Pedrini
Certo che uno deve avere proprio tempo da buttare per passare l’intero pomeriggio a cercare di disegnare, con query SQL ricorsive, alberi di Natale, a altre amenità, l’ultimo giorno dell’anno (Oggi 31 Dicembre 2021)
In realtà proprio ieri ho fatto la terza dose di Vaccino Anti-Covid e la mattina l’ho passata a dormire…
Dopo pranzo cerco di fare qualcosa che mi distragga, per cercare di non far salire ancora la febbre, e mi metto al computer.
Il mio cane (Ugo) mi guarda dalla finestra non troppo contento per questa scelta in una giornata che sembra Primavera con 20 gradi centigradi in mezzo alle montagne (grazie al vento Favonio – Phoen).
Diciamo che voleva essere un modo simpatico di fare gli auguri di Buon Anno 2022 a tutta la Community IBM i… visto la mia assenza di questi periodi per “super-lavoro” e cambiamenti vari.
Prima di deliziarvi con simpatici alberelli cerchiamo di capire i concetti di Query Ricorsive SQL
Index
Recursive CTE SQL – Creare una serie di numeri
Ecco un esempio di query ricorsiva (in verità possiamo anche evitare la keyword “recursive”, l’ho messa solo per chiarezza).
Chi ha giocato con le distinte basi o altre tabelle con dipendenze ricorsvie avrà anche utilizzato le keyword “Connect By” (ne abbiamo parlato in questo post (Un po’ di cross join : https://blog.faq400.com/it/database-db2-for-i/cross-join-db2-for-i/).
WITH recursive take10(list_of_numbers) AS
(SELECT 0 FROM sysibm.sysdummy1
UNION ALL
SELECT
list_of_numbers+1
FROM take10
WHERE list_of_numbers < 10)
SELECT * FROM take10;
Un alberello di Natale
Ora che abbiamo capito le query ricorsive vediamo di divertirci… creando un piccolo “alberello di Natale”
--- Small Tree
WITH small_tree(tree_depth,pine) AS (
SELECT 1 tree_depth,rpad(' ',10,' ') || '*' pine
FROM sysibm.sysdummy1
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;
Probabilmente anche il mio cane lo faceva meglio … ma non ho mai avuto delle velleità artistiche.
Tre alberelli di Natale
Possiamo anche esagerare …. non costano così tanto questi alberli e sono assolutamente rispettosi dell’ambiente!
WITH small_tree(tree_depth,pine) AS (
SELECT 1 tree_depth,
rpad(' ',10,' ') || '*'
|| rpad(' ',20,' ') || '*'
|| rpad(' ',20,' ') || '*'
pine
FROM sysibm.sysdummy1
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 rpad(' ',9,' ') ||'Ho'
|| rpad(' ',19,' ') || 'Ho'
|| rpad(' ',19,' ') || 'Ho'
pine
FROM sysibm.sysdummy1
UNION ALL
SELECT pine
FROM small_tree;
L’uomo con il cappello
L’uomo con il Cappello … forse era anche un film … oppure un libro … oppure semplicemente il tipico uomo con il cappello sulla sua FIAT Seicento che ti taglia la strada a 30 KM all’ora quando hai fretta.
Eccolo qui!
-- A man with a Hat (https://www.sqlservertutorial.net/sql-server-basics/sql-server-recursive-cte/)
WITH RECURSIVE hat (hat_pattern, level)
AS (
SELECT
CAST(REPEAT(' ', 11) concat trim('/V\ ') AS VARCHAR(100))
AS hat_pattern,
1 AS level
from sysibm.sysdummy1
UNION ALL
SELECT
CAST(
REPEAT(' ', 10-level) || '/'
|| REPEAT('V', 2 * level + 1) || trim('V\ ')
AS VARCHAR(100))
AS repeated_pattern,
hat.level + 1
FROM hat
WHERE level < 6
)
SELECT hat_pattern
FROM hat
UNION ALL
SELECT
CAST(
REPEAT(' ', 5) || '|' || ' ' || '|'
AS VARCHAR(100))
AS forehead
from sysibm.sysdummy1
UNION ALL
SELECT
CAST(
REPEAT(' ', 5) || '|' || ' O / O ' || '|'
AS VARCHAR(100))
AS eyes
from sysibm.sysdummy1
UNION ALL
SELECT
CAST(
REPEAT(' ', 5) || '|' || ' /_ ' || '|'
AS VARCHAR(100))
AS nose
from sysibm.sysdummy1
UNION ALL
SELECT
CAST(
REPEAT(' ', 5) || '|' || ' ~~~~~ ' || '|'
AS VARCHAR(100))
AS mouth
from sysibm.sysdummy1
UNION ALL
SELECT
CAST(
REPEAT(' ', 5) || '|' || ' { | } ' || '|'
AS VARCHAR(100))
AS chin
from sysibm.sysdummy1;
Accendiamo anche qualche lucina … in modo casuale!
Ecco un altro albero con le luci di Natale che si “accendono” casualmente (provate a lanciarlo più volte)!
Qui deve essere un effetto del Vaccino che mi fa vedere le @ come se fossero luci dell’albero!
select replace(
replace(
replace(mystring, 'X' , 'O')
, 'T', 'u')
, '@', 'i')
from
(
;
select * from (
select lpad(' ',20-e-i) ||
case when rand() < 0.3
then substr(s,1,e*2-3+i*2)
else substr(substr(s , 1 ,int(rand()*(e*2-3+i*2-1))) || '@' || s , 1 ,e*2-3+i*2) end as "ChristmasTree"
from
( select rpad('X',40,'X') s,
rpad('T',40,'T') t
from sysibm.sysdummy1 ) ,
( select level i, level+2 hop from sysibm.sysdummy1 connect by level <= 4 ) , lateral
(select level e
from sysibm.sysdummy1
connect by level <= hop )
union all
select lpad(' ',17)||substr(t,1,3) from
(select rpad('X',40,'X') s,
rpad('T',40,'T') t
from sysibm.sysdummy1)
connect by level <= 5
) a ;
Conclusioni
Spero di avervi almeno rubato un sorriso … non credo che questo “post” porti del gran valore al vostro lavoro (e fatevala questa cavolo di risata!)
Dicono che i migliori regali sono quelli dove uno investe il proprio tempo per farli … non limitandosi al solo gesto di estrarre la carta di credito dal portafoglio (o direttamente dallo Smartphone): io qui ci ho investito un intero pomeriggio post-vaccinazione.
Auguro alla Community IBM i un buon anno 2022, che sia meglio in tutto rispetto a quello passato!
Auguri di buon 2022 da tutto lo staff Faq400!
PS Una cosa è certa … questo 2022 sarà un anno di cambiamenti importanti e di nuove cose che bollono in pentola …. vi aggiorneremo presto!
Roberto
Link e riferimenti
In realtà di mio in questo post c’è ben poco … ho semplicemente riadattato del materiale SQL da altri DB per il nostro grande DB2 for i SQL … ma non ditelo in giro!
- How to Draw a Christmas Tree in SQL https://learnsql.com/blog/draw-christmas-tree-sql/
- SQL Server Recursive CTE: https://www.sqlservertutorial.net/sql-server-basics/sql-server-recursive-cte/
- Print Christmas tree in SQL Server : https://sqlskull.com/2020/12/02/print-christmas-tree-in-sql-server/
- How to printout a Christmass Tree in SQL: https://stackoverflow.com/questions/65434426/how-do-i-print-out-a-christmas-tree-with-sql
This is very interesting. Do you have an English version of your website?