02 - Database DB2 for i02a - SQL

Drawing with DB2 for i SQL – Buon anno 2022!

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)

Ugo vuole andare a passeggio!

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

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!

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

--- Roberto De Pedrini Faq400.com
About author

Founder di Faq400 Srl, IBM Champion, ideatore del sito Faq400.com e del Blog blog.faq400.com. Sviluppatore RPG da quando avevo i pantaloni corti, forte sostenitore della piattaforma IBM i (ex AS400), ho sempre cercato di convididere le mie conoscenze con gli altri tramite forum, eventi e corsi. Oggi, tramite Faq400 Srl, cerchiamo di aiutare le aziende a sfruttare al meglio questa fantastica piattaforma IBM i.

1 Comment

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *