FORUM PER UTENTI MILLEWIN
Attenzione !
Per intervenire sul forum è necessario essere registrati e connessi.

L'Amministratore

****************************************************
“Se tu hai una mela ed io ho una mela, e ce la scambiamo, alla fine tu ed io avremo sempre una mela ciascuno.
Ma se tu hai un’idea ed io ho un’idea, e ce la scambiamo, allora avremo entrambi due idee”.

George Bernard Shaw
****************************************************

SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Andare in basso

SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Sab 21 Nov 2015 - 11:42

Chiedo agli amici più esperti come debbano essere rese sintatticamente in postgres le espressioni di questo tipo che utilizzavo in una vecchia query:

if p.codice IN (select y.codice from cart_pazpbl y where y.cp_code like '250%') then 1 else 0 endif AS _Diabete_I_e_II,

if p.codice IN (select y.codice from cart_pazpbl y where y.cp_code like '496') then 1 else 0 endif AS _BPCO_,
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Sab 21 Nov 2015 - 11:54

Io avrei pensato di renderla in questo modo che ne pensate?

CASE WHEN p.codice IN (select y.codice from cart_pazpbl y where y.cp_code like '250%') then 1 else 0 END AS _Diabete_I_e_II,
CASE WHEN p.codice IN (select y.codice from cart_pazpbl y where y.cp_code like '496') then 1 else 0 END AS _BPCO_
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Sab 21 Nov 2015 - 23:01

Anche questo tipo di espressione non funziona in postgres...

(_diabete_I_e_II + _BPCO_ + _Insufficienza_Respiratoria_Cronica_ + _Embolia_+ _Fibrillazione_Atriale_ + Protesi_Valvolare_Meccanica + Scompenso + Trombosi_Edocavitaria + _Ictus_) As N_Eventi

per maggiore chiarezza mi riferisco ad istruzioni presenti in questa vecchia query postata nel sito qui http://utentimillewin.forumattivo.it/t558p15-telemedicina-per-pz-in-adi
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Cervino il Dom 22 Nov 2015 - 2:05

Adattare  le  query  da  Sybase  a  PostgreSql comporta un lavoro sicuramente rispetto maggiore a riscriverle ex-novo e con risultati non sempre affidabili , come nell' esempio seguente , come richiesto da Lucio :

SELECT distinct p.cognome || '    '|| p.nome AS Nome , p.codice_fiscale , p.nascita , Days( p.nascita , Today())*24/8766  As  eta ,  p.sesso ,  u.codice_regionale  As  MMG_code ,
       /* COLONNA VUOTA PER INSERIMENTO PUNTEGGIO EARLI */
' '           _EARLI_ ,

Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '250%' )   THEN  1   ELSE  0   END 
             _DM_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '496' )    THEN  1   ELSE  0   END
            _BPCO_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '799.1' ,'518.81' ))    THEN  1   ELSE  0   END
            _Insufficienza_Respiratoria_Cronica_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '415.1' ,'415.11' , '415.19' ))    THEN  1   ELSE  0   END
            _Embolia_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '427.3%' )    THEN  1   ELSE  0   END
            _Fibrillazione_Atriale_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike 'V43.3%' )   THEN  1   ELSE  0   END
            _Protesi_Valvolare_Meccanica_ ,

            /* ESTRAE PROBLEMA SCOMPENSO E CODICI SIMILI APERTO DA QUALSIASI DATA */
Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '514' , '518.4' , '428' , '428.0' , '428.1' , '428.9' , '429.4' ))   THEN  1   ELSE  0   END
               _Scompenso_ ,

             /*ESTRAE PROBLEMA SCOMPENSO SE PIU DI UN EPISODIO NELL ULTIMO ANNO*/
/* Case   WHEN ( Select count (b.codice) From cart_pazpbl b Where b.codice=p.codice And b.cp_code IN ('514' , '518.4' , '428' , '428.0' , '428.1' , '428.9' , '429.4') AND b.data_open >= (Today() -365)) >1     THEN  1   ELSE  0   END
                 _Scompenso_ , */

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '429.79%' )     THEN  1   ELSE  0   END
                 _Trombosi_Edocavitaria_ ,

Case   WHEN p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '436' , '431' ))     THEN  1   ELSE  0   END
                 _Ictus_,

             /* INSERISCE SI SE ADP ATTIVA ALTRIMENTI LASCIA VUOTA LA CASELLA */
Case   WHEN p.codice IN ( Select i.codice From cart_concessioni_pip i Where i.incent_code ILike '0000023' And i.data_fine_autorizz >= Today())    THEN  1   ELSE  0   END
                 _ADP_ ,

          /* INSERISCE SI SE ADI ATTIVA ALTRIMENTI LASCIA VUOTA LA CASELLA */
Case   WHEN p.codice IN ( Select i.codice From cart_concessioni_pip i Where i.incent_code ILike '0000024' And i.data_fine_autorizz >= Today())      THEN  1   ELSE  0   END
                 _ADI_ ,

          /* COLONNA VUOTA PER ISERIMENTO PAZIENTE RESIDENTE RSA */
' '               _RSA_ ,

Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '250%' )   THEN  Cast( 1 As SmallInt ) ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '496%' )   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '799.1' ,'518.81' ))   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END 
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '415.1' ,'415.11' , '415.19' ))   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike '427.3%' )   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code ILike 'V43.3%' )    THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '514' , '518.4' , '428' , '428.0' , '428.1' , '428.9' , '429.4' ))   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code  ILike '429.79%' )   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END
+  Case   WHEN   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '436' , '431' ))   THEN  Cast( 1 As SmallInt )    ELSE  Cast( 0 As SmallInt )    END                           
                          _N_Eventi_

FROM   ( pazienti p  LEFT Outer JOIN   nos_002 n       ON   p.codice = n.codice )                       
                              LEFT Outer JOIN   v_utenti u       ON     n.pa_medi = u.userid
WHERE    u.codice_regionale  ILike  '%'      AND      u.nome  ILike  '%' 
AND  p.pa_convenzione = 'S'                     AND     Days( p.nascita , Today())*24/8766  > 64.9
AND  ( n.pa_drevoca Is Null  Or  n.pa_drevoca > Today()  Or ( n.pa_drevoca Between  Date( Today())-365  And Today() And motivo_revoca = 'S'))  And  p.decesso Is Null
AND  p.codice IN ( Select b.codice From cart_pazpbl b Where (  b.cp_code ILike '250%' Or b.cp_code ILike '427.3%' Or b.cp_code ILike '429.79%' Or b.cp_code ILike '496%' Or b.cp_code ILike 'V43.3%' ))
OR   p.codice IN ( Select b.codice From cart_pazpbl b Where b.cp_code IN ( '415.1' , '415.11' , '415.19' , '428' , '428.0' , '428.1' , '428.9' , '429.4' , '431' , '436' , '514' , '518.4' , '518.81' , '799.1' ))
ORDER BY  20 desc , 1 , 2 , 3


Ti saluto ,  Sergio

Cervino
Membro Junior
Membro Junior

Messaggi : 221
Punti : 3025
Voti per importanza dei messaggi : 16
Data d'iscrizione : 03.03.11
Età : 64
Località : Orzivecchi (BS)

Visualizza il profilo

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Dom 22 Nov 2015 - 7:51

Cervino ha scritto:Adattare  le  query  da  Sybase  a  PostgreSql comporta un lavoro sicuramente rispetto maggiore a riscriverle ex-novo e con risultati non sempre affidabili , come nell' esempio seguente , come richiesto da Lucio :


Grazie Sergio per la query che mi e' utile per imparare.
Ho notato che ha risolto i problemi con espressioni tipo CASE WHEN .... e che non hai fatto riferimento agli ALIAS richiamando interamente le singole espressioni dove necessario.
Ho notato anch'io che soprattutto richiamando 'alias dinamici' si genera errore tipo 'la colonna non esiste'.
L'errore si presenta soprattutto usando WHEN probabilmente perche', se ho capito bene, postgres esegue l'struzione WHEN prima della SELECT e genera errore.
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Cervino il Dom 22 Nov 2015 - 8:49

Ciao Lucio ,               in  PostgreSql  bisogna usare x le sequenze logico-condizionali : 
CASE  ...   WHEN  ...  THEN  ...   ELSE   ...   END       al  posto  di   IF  ...   THEN  ....   ELSE  ...  ENDIF ; 
inoltre  non è  possibile fare  riferimento ad altri campi / colonne / valori all' interno di query e/o subquery utilizzando  ALIAS ( cosi comodi e pratici ) ma è necessario indicare sempre in modo esplicito gli eventuali campi / colonne / valori da utilizzare ( in tal modo la query diventa molto prolissa ) ;
l' alternativa è fare delle PreEstrazioni con  WITH : ma in tal modo la query va impostata con una sequenza logica verticale anziché orizzontale come in Sybase con una complessa alterazione della struttura della query .

Saluti   Sergio  Tomasini ,   Orzivecchi  (BS)

Cervino
Membro Junior
Membro Junior

Messaggi : 221
Punti : 3025
Voti per importanza dei messaggi : 16
Data d'iscrizione : 03.03.11
Età : 64
Località : Orzivecchi (BS)

Visualizza il profilo

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Dom 22 Nov 2015 - 9:47

Cervino ha scritto:Ciao Lucio ,               in  PostgreSql  bisogna usare x le sequenze logico-condizionali : 
CASE  ...   WHEN  ...  THEN  ...   ELSE   ...   END       al  posto  di   IF  ...   THEN  ....   ELSE  ...  ENDIF ; 
inoltre  non è  possibile fare  riferimento ad altri campi / colonne / valori all' interno di query e/o subquery utilizzando  ALIAS ( cosi comodi e pratici ) ma è necessario indicare sempre in modo esplicito gli eventuali campi / colonne / valori da utilizzare ( in tal modo la query diventa molto prolissa ) ;
l' alternativa è fare delle PreEstrazioni con  WITH : ma in tal modo la query va impostata con una sequenza logica verticale anziché orizzontale come in Sybase con una complessa alterazione della struttura della query .

Saluti   Sergio  Tomasini ,   Orzivecchi  (BS)



Questo e' davvero un problema che aumenta di non poco la difficolta' di scrittura e la leggibilita'delle query, quantomeno di quelle piu' complesse. 
Visto che si doveva cambiare, sarebbe stato meglio migrare verso mysql ma purtroppo dobbiamo digerire anche questa.


Ultima modifica di Lucio Mignone il Lun 23 Nov 2015 - 10:07, modificato 2 volte
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Cervino il Dom 22 Nov 2015 - 23:17

Lucio Mignone ha scritto:
Questo e' davvero un problema che aumenta di non poco la difficolta' di scrittura e la leggibilita'delle query, quantomeno di quelle piu' complesse. 
Visto che si doveva cambiare, sarebbe stato meglio migrare verso mysql, ma purtroppo dobbiamo digerire anche questa... Sad
Per la diffcoltà di scrittura ... basta usare il copia e incolla ;  per la leggibilità sicuramente : ma è un problema per Chi scrive le query , non per Chi le utilizza .
PostgreSql è uno strumento per gestire database molto complessi e di dimensioni ragguardevoli, sistema operativo indipendente , progettato x eseguire ricerche e /o interrogazioni raffinate su database anche molto estesi e articolati;  certo x le nostre semplici query, forse è un ambiente di lavoro forse troppo vasto ed articolato ma non certo eccessivo ; basta adattarsi ed imparare a sfuttare le nuove opportunità che offre ( Flessibilità , Praticità ,
Semplicità di Accesso alle Tabelle , .... ) ed a interrogare il MillePS secondo una logica lievemente diversa .

Saluti   Sergio  Tomasini ,   Orzivecchi  (BS)

Cervino
Membro Junior
Membro Junior

Messaggi : 221
Punti : 3025
Voti per importanza dei messaggi : 16
Data d'iscrizione : 03.03.11
Età : 64
Località : Orzivecchi (BS)

Visualizza il profilo

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Lucio Mignone il Lun 23 Nov 2015 - 10:05

Cervino ha scritto:
Lucio Mignone ha scritto:
Questo e' davvero un problema che aumenta di non poco la difficolta' di scrittura e la leggibilita'delle query, quantomeno di quelle piu' complesse. 
Visto che si doveva cambiare, sarebbe stato meglio migrare verso mysql, ma purtroppo dobbiamo digerire anche questa... Sad
Per la diffcoltà di scrittura ... basta usare il copia e incolla ;  per la leggibilità sicuramente : ma è un problema per Chi scrive le query , non per Chi le utilizza .
PostgreSql è uno strumento per gestire database molto complessi e di dimensioni ragguardevoli, sistema operativo indipendente , progettato x eseguire ricerche e /o interrogazioni raffinate su database anche molto estesi e articolati;  certo x le nostre semplici query, forse è un ambiente di lavoro forse troppo vasto ed articolato ma non certo eccessivo ; basta adattarsi ed imparare a sfuttare le nuove opportunità che offre ( Flessibilità , Praticità ,
Semplicità di Accesso alle Tabelle , .... ) ed a interrogare il MillePS secondo una logica lievemente diversa .

Saluti   Sergio  Tomasini ,   Orzivecchi  (BS)

Io non sono un esperto ma da quello che ho letto Postgres garantisce sicuramente un'affidabilità maggiore nella gestione e protezione dei dati, Mysql non farebbe altrettanto ma si legge che è molto più pratico e ricco di funzioni e molto più diffuso.

Ma penso che il motivo per cui siamo migrati a Postgres sia questo: '...Se si desidera la possibilità di trasferimento (porting) del progetto, perchè è cresciuto molto, su database Oracle. Postgresql, rispettando  gli standard ISO per SQL, rende il passaggio sufficentemente agevole. Con MySQL questo non sarà possibile poichè non é conforme agli standard ISO...'
e perché : 'MySQL infatti viene distribuito con un tipo di licenza "Copyleft" che obbliga effettivamente i produttori di software proprietario o a rendere open source la loro applicazione o a comprare una licenza di sviluppo da una sola grande entità commerciale, Oracle, che detiene i diritti di MySQL..


In ogni caso (a parte le precedenti considerazioni sulle query e gli alias) il passaggio a Postgres mi sembra abbia portato molti vantaggi in ogni senso rispetto a Sybase…Smile
avatar
Lucio Mignone
Membro Senior
Membro Senior

Messaggi : 626
Punti : 3586
Voti per importanza dei messaggi : 34
Data d'iscrizione : 20.02.11
Età : 54
Località : CAVRIGLIA (AR)

Visualizza il profilo http://comeva.altervista.org/

Torna in alto Andare in basso

Re: SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF

Messaggio  Contenuto sponsorizzato


Contenuto sponsorizzato


Torna in alto Andare in basso

Torna in alto

- Argomenti simili

 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum