Funzione IF in una select da sql

mercoledì 18 novembre 2009 - 11.04

aemme Profilo | Junior Member

Sto creando un programmino, con delle select da alcune tabelle, questa è la select:

SELECT PCMS_CHDOC_DATA.CH_DOC_ID,

PCMS_CHDOC_DATA.CH_UID,

PCMS_CHDOC_DATA.CH_DOC_TYPE,

PCMS_CHDOC_DATA.STATUS,

PCMS_CHDOC_DATA.TOOL,



PCMS_CHDOC_DATA_2.CH_DOC_ID,

PCMS_CHDOC_DATA_2.CH_UID,

PCMS_CHDOC_DATA_2.CH_DOC_TYPE,

PCMS_CHDOC_DATA_2.STATUS,

PCMS_CHDOC_DATA_2.TOOL,

PCMS_CHDOC_DATA_2.DROP_TRIGGER,



PCMS_CHDOC_DETAIL_DESC.CH_DOC_ID,

PCMS_CHDOC_DETAIL_DESC.CH_UID,

PCMS_CHDOC_DETAIL_DESC.FILE_VERSION,

PCMS_CHDOC_DETAIL_DESC.DATA,



PCMS_CHDOC_ACTION_DESC.CH_DOC_ID,

PCMS_CHDOC_ACTION_DESC.CH_UID,

PCMS_CHDOC_ACTION_DESC.FILE_VERSION,

PCMS_CHDOC_ACTION_DESC.DATA,



PCMS_CHDOC_ACTION_DESC_2.CH_DOC_ID,

PCMS_CHDOC_ACTION_DESC_2.CH_UID,

PCMS_CHDOC_ACTION_DESC_2.FILE_VERSION,

PCMS_CHDOC_ACTION_DESC_2.DATA





FROM

PCMS_CHDOC_DATA,

PCMS_CHDOC_DATA PCMS_CHDOC_DATA_2,

PCMS_CHDOC_DETAIL_DESC,

PCMS_CHDOC_ACTION_DESC,

PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_2



WHERE



PCMS_CHDOC_DATA.STATUS NOT LIKE 'CLOSED'

AND PCMS_CHDOC_DATA.TOOL = 'ICD'

AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_DATA_2.DROP_TRIGGER



AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_DETAIL_DESC.CH_DOC_ID

AND PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_DETAIL_DESC.CH_UID



AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_ACTION_DESC.CH_DOC_ID

AND PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_ACTION_DESC.CH_UID



AND PCMS_CHDOC_ACTION_DESC.FILE_VERSION IN (SELECT MAX(FILE_VERSION)

FROM PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_3

WHERE PCMS_CHDOC_ACTION_DESC_3.CH_UID = PCMS_CHDOC_DATA.CH_UID AND PCMS_CHDOC_ACTION_DESC_3.CH_DOC_ID =

PCMS_CHDOC_ACTION_DESC_3.CH_DOC_ID = PCMS_CHDOC_DATA.CH_DOC_ID)



AND PCMS_CHDOC_DATA_2.CH_DOC_ID = PCMS_CHDOC_ACTION_DESC_2.CH_DOC_ID

AND PCMS_CHDOC_DATA_2.CH_UID = PCMS_CHDOC_ACTION_DESC_2.CH_UID



AND PCMS_CHDOC_ACTION_DESC_2.FILE_VERSION IN (SELECT MAX(FILE_VERSION)

FROM PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_4

WHERE PCMS_CHDOC_ACTION_DESC_4.CH_UID = PCMS_CHDOC_DATA_2.CH_UID AND PCMS_CHDOC_ACTION_DESC_4.CH_DOC_ID =

PCMS_CHDOC_ACTION_DESC_3.CH_DOC_ID = PCMS_CHDOC_DATA_2.CH_DOC_ID)



ORDER BY PCMS_CHDOC_DATA.CH_DOC_ID, PCMS_CHDOC_DATA_2.CH_DOC_ID;


Il problema è che dovrei aggiungere anche un'altra tabella, anzi sono due ma sono uguali, quindi trovato il trucco per una posso farlo anche per la seconda, comunque in questa altra tabella ci sono delle similitudini con PCMS_CHDOC_DATA, ma non c'è la giusta corrispondenza per tutti i records di PCMS_CHDOC_DATA.

In pratica se PCMS_CHDOC_DATA contiene 100 records PCMS_CHDOC_THIS_ACTION_DESC ne contiene 30, alla fine quindi invece di avere tutti e 100 i records, con i valori, dove i sono, di PCMS_CHDOC_THIS_ACTION_DESC, ne avrò solo 30.

La corrispondenza che vorrei fare è :

PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID
and PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_THIS_ACTION_DESC.CH_UID

Vorrei però sapere se è possibile introdurre un IF nella select in modo tale che se non c'è nessuna corrispondenza mi restituisca una stringa.

Sto utilizzando Crystal Report per scrivere questa select, forse potrei utilizzare anche i SottReport ma non so come utilizzarli

Come posso fare?

Grazie

alx_81 Profilo | Guru

>In pratica se PCMS_CHDOC_DATA contiene 100 records PCMS_CHDOC_THIS_ACTION_DESC
>ne contiene 30, alla fine quindi invece di avere tutti e 100
>i records, con i valori, dove i sono, di PCMS_CHDOC_THIS_ACTION_DESC,
>ne avrò solo 30.
>
>La corrispondenza che vorrei fare è :
>
>PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID
>and PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_THIS_ACTION_DESC.CH_UID
>
>Vorrei però sapere se è possibile introdurre un IF nella select
>in modo tale che se non c'è nessuna corrispondenza mi restituisca
>una stringa.
>Come posso fare?
puoi fare una LEFT JOIN. Metti a "sinistra" la tabella con i 100 record e a "destra" le altre.
Con la LEFT JOIN otterrai 100 record e quando non si ha la corrispondenza a "destra" vedrai dei record a NULL.
Puoi usare poi la funzione ISNULL o la COALESCE per cambiare il null col valore che ti serve (ad esempio 'Non trovato').

LEFT JOIN
http://blogs.dotnethell.it/sandro/Join-in-SQL-Server__4152.aspx

ISNULL function
http://msdn.microsoft.com/en-us/library/ms184325.aspx

COALESCE function
http://msdn.microsoft.com/it-it/library/ms190349.aspx

>Grazie
di nulla!
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Grazie mille, la provo,

non ho ben capito però come usare la funzione COALESCE,
mi puoi fare un esempio?

alx_81 Profilo | Guru

>Grazie mille, la provo,
>
>non ho ben capito però come usare la funzione COALESCE,
>mi puoi fare un esempio?
Come la ISNULL, anche se puoi usarla in altro modo:

SELECT COALESCE(campo, valore) SELECT ISNULL(campo, valore)
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Grazie per la risposta della funzione COALESCE,

solo che ho scritto le seguenti righe:

.....................

PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID,

PCMS_CHDOC_THIS_ACTION_DESC.CH_UID,

PCMS_CHDOC_THIS_ACTION_DESC.FILE_VERSION,

PCMS_CHDOC_THIS_ACTION_DESC.DATA





FROM

PCMS_CHDOC_DATA,

PCMS_CHDOC_DATA PCMS_CHDOC_DATA_2,

PCMS_CHDOC_DETAIL_DESC,

PCMS_CHDOC_ACTION_DESC,

PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_2



LEFT JOIN PCMS_CHDOC_THIS_ACTION_DESC ON



(PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID)



WHERE



PCMS_CHDOC_DATA.STATUS NOT LIKE 'CLOSED'

AND PCMS_CHDOC_DATA.TOOL = 'ICD'

AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_DATA_2.DROP_TRIGGER


..........................


....ma mi dice che è PCMS_CHDOC_DATA.CH_DOC_ID è un "invalid identifier"

non mi sembra sia sbagliata cosa c'è che non va?

alx_81 Profilo | Guru

>dice che è PCMS_CHDOC_DATA.CH_DOC_ID è un "invalid identifier"
>
>non mi sembra sia sbagliata cosa c'è che non va?
passami la create delle tabelle e la select completa, così riesco a capire meglio.

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Eccola:

SELECT PCMS_CHDOC_DATA.CH_DOC_ID,

PCMS_CHDOC_DATA.CH_UID,

PCMS_CHDOC_DATA.CH_DOC_TYPE,

PCMS_CHDOC_DATA.STATUS,

PCMS_CHDOC_DATA.TOOL,



PCMS_CHDOC_DATA_2.CH_DOC_ID,

PCMS_CHDOC_DATA_2.CH_UID,

PCMS_CHDOC_DATA_2.CH_DOC_TYPE,

PCMS_CHDOC_DATA_2.STATUS,

PCMS_CHDOC_DATA_2.TOOL,

PCMS_CHDOC_DATA_2.DROP_TRIGGER,



PCMS_CHDOC_DETAIL_DESC.CH_DOC_ID,

PCMS_CHDOC_DETAIL_DESC.CH_UID,

PCMS_CHDOC_DETAIL_DESC.FILE_VERSION,

PCMS_CHDOC_DETAIL_DESC.DATA,



PCMS_CHDOC_ACTION_DESC.CH_DOC_ID,

PCMS_CHDOC_ACTION_DESC.CH_UID,

PCMS_CHDOC_ACTION_DESC.FILE_VERSION,

PCMS_CHDOC_ACTION_DESC.DATA,



PCMS_CHDOC_ACTION_DESC_2.CH_DOC_ID,

PCMS_CHDOC_ACTION_DESC_2.CH_UID,

PCMS_CHDOC_ACTION_DESC_2.FILE_VERSION,

PCMS_CHDOC_ACTION_DESC_2.DATA,



PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID,

PCMS_CHDOC_THIS_ACTION_DESC.CH_UID,

PCMS_CHDOC_THIS_ACTION_DESC.FILE_VERSION,

PCMS_CHDOC_THIS_ACTION_DESC.DATA





FROM

PCMS_CHDOC_DATA,

PCMS_CHDOC_DATA PCMS_CHDOC_DATA_2,

PCMS_CHDOC_DETAIL_DESC,

PCMS_CHDOC_ACTION_DESC,

PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_2



LEFT JOIN PCMS_CHDOC_THIS_ACTION_DESC ON



(PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_THIS_ACTION_DESC.CH_DOC_ID)



WHERE



PCMS_CHDOC_DATA.STATUS NOT LIKE 'CLOSED'

AND PCMS_CHDOC_DATA.TOOL = 'ICD'

AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_DATA_2.DROP_TRIGGER



AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_DETAIL_DESC.CH_DOC_ID

AND PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_DETAIL_DESC.CH_UID



AND PCMS_CHDOC_DATA.CH_DOC_ID = PCMS_CHDOC_ACTION_DESC.CH_DOC_ID

AND PCMS_CHDOC_DATA.CH_UID = PCMS_CHDOC_ACTION_DESC.CH_UID



AND PCMS_CHDOC_ACTION_DESC.FILE_VERSION IN (SELECT MAX(FILE_VERSION)

FROM PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_3

WHERE PCMS_CHDOC_ACTION_DESC_3.CH_UID = PCMS_CHDOC_DATA.CH_UID AND PCMS_CHDOC_ACTION_DESC_3.CH_DOC_ID = PCMS_CHDOC_DATA.CH_DOC_ID)



AND PCMS_CHDOC_DATA_2.CH_DOC_ID = PCMS_CHDOC_ACTION_DESC_2.CH_DOC_ID

AND PCMS_CHDOC_DATA_2.CH_UID = PCMS_CHDOC_ACTION_DESC_2.CH_UID



AND PCMS_CHDOC_ACTION_DESC_2.FILE_VERSION IN (SELECT MAX(FILE_VERSION)

FROM PCMS_CHDOC_ACTION_DESC PCMS_CHDOC_ACTION_DESC_4

WHERE PCMS_CHDOC_ACTION_DESC_4.CH_UID = PCMS_CHDOC_DATA_2.CH_UID AND PCMS_CHDOC_ACTION_DESC_4.CH_DOC_ID = PCMS_CHDOC_DATA_2.CH_DOC_ID)



ORDER BY PCMS_CHDOC_DATA.CH_DOC_ID, PCMS_CHDOC_DATA_2.CH_DOC_ID;

alx_81 Profilo | Guru

passami anche la create, sennò non riesco a fare il controllo sintattico
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Qual'è la create?

Intendi il format della tabella?

Purtroppo al momento posso solo creare i comandi SQL con Crystal Report

alx_81 Profilo | Guru

>Qual'è la create?
>
>Intendi il format della tabella?
stai usando SQL Server? Access? Una tabella ha sempre una sintassi di create, ma con access basta che mi passi i campi con il tipo corretto.


--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Sto usando crystal report,

tra l'altro non è una tabella ma una view.

Se mi dici come fare con crystal report provo a farlo

aemme Profilo | Junior Member

Ti posso dare questo:

1277x994 145Kb

alx_81 Profilo | Guru

>Sto usando crystal report,
>tra l'altro non è una tabella ma una view.
>Se mi dici come fare con crystal report provo a farlo
se è una view di sql server basta scriptare la create da sql server management studio, crystal non fa nulla di tutto ciò

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

Ti può servire questo JPEG ? -->

1277x994 145Kb

alx_81 Profilo | Guru

ok, quello che mi passi non va bene. Non posso fare copia incolla per crearmi le tabelle.
guardando un po' così ho visto che non usi la sintassi con le join ma n tabelle nella from.
invece che fare n tabelle in from, prova a riscriverla con la sintassi join:
SELECT campi FROM tabella1 T1 JOIN tabella2 T2 ON T1.campo = T2.campo ... LEFT JOIN tabella3 T3 ON T3.campo = T1.campo ...


--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

aemme Profilo | Junior Member

OK, adesso sembra funzionare perfettamente.

Ha fatto il retrieve di tutti i records,

devo solo aggiungere un'altra view, ISNULL o COALENSCE ed è finito

sei un grande

Ciao

alx_81 Profilo | Guru

se ti ha aiutato accetta la risposta così chiudiamo il thread
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5