2015-05-19 12 views
5

Attualmente desidero fare una sorta di unione condizionale. Dato il seguente esempio:Dichiarazione del caso per determinare se dovrei l'unione

SELECT age, name 
FROM users 
UNION 
SELECT 25 AS age, 'Betty' AS name 

detto che volevo solo l'unione la seconda affermazione se il numero di utenti 'era> = 2, altrimenti non fare l'unione dei due.

In sintesi desidera aggiungere una tabella con una riga se la tabella ha solo 2 o più valori.

+3

Btw, utilizzare 'UNION ALL' se non si desidera eliminare i duplicati, è più efficiente. –

+0

È una stored procedure o una funzione con valori di tabella o una query semplice? –

+1

'CASE' è un'espressione * * - deve restituire un singolo valore scalare (per riga, se parte di un set di risultati). –

risposta

10

Si potrebbe utilizzare un brutto hack qualcosa di simile, ma penso Tim's answer è meglio:

SELECT age, name 
FROM users 
UNION ALL 

SELECT 25 AS age, 'Betty' AS name 
WHERE (SELECT COUNT(*) FROM users) > 1 
+0

Perché stai utilizzando la prima tabella e la tabella degli utenti nella seconda query? Basta rimuovere il tavolo e il primo 1 dal momento che stai selezionando le costanti. –

+0

fatto, ho solo pensato a questo proposito come un rapido hack, e dopo un secondo pensiero mi sono reso conto che posso farlo senza il da –

+1

perché "brutto hack"? afferma in puro sql esattamente ciò che l'OP vuole. – 1010

6

Se è in una stored procedure, è possibile utilizzare If...Else:

IF (SELECT COUNT(*) FROM users) < 2 
BEGIN 
    SELECT age, name 
    FROM users 
    END 
ELSE 
    SELECT age, name 
    FROM users 
    UNION ALL 
    SELECT 25 AS age, 'Betty' AS name 

In caso contrario si potrebbe provare qualcosa di simile:

SELECT age, name 
    FROM users 
    UNION ALL 
    SELECT TOP 1 25 AS age, 'Betty' AS name 
    FROM users 
    WHERE (SELECT COUNT(*) FROM users) >= 2 

Nota che ho usato UNION ALL in quanto non è così sembra che tu voglia eliminare i duplicati.

Giocato da queste parti: http://sqlfiddle.com/#!6/a7540/2323/0

Edit: Al posto del mio secondo approccio preferisco Zohar's. Quindi se puoi usare If....Else preferisci che altrimenti WHERE (SELECT COUNT(*) FROM users) > 1 senza un tavolo.

+0

nella seconda query, SELECT 'Betty' dagli utenti moltiplicherà Betty per # di utenti. – 1010

+0

@ 1010: no, perché? Ho usato 'TOP 1'. Ma questo è il motivo per cui ho menzionato che preferisco l'approccio Zohar. –

+0

Perché il primo 1? Sarebbe più facile rimuovere il primo 1 e la tabella degli utenti poiché è sufficiente selezionare le costanti. –

5

Qualcosa come il seguente dovrebbe funzionare:

SELECT age, name 
FROM users 

UNION ALL 

SELECT age, name 
FROM (SELECT 25 AS age, 'Betty' AS name) x 
CROSS APPLY (SELECT COUNT(*) FROM users) y(cnt) 
WHERE y.cnt >= 2 

Seconda parte del UNION ALL sarà NULL nella tabella users ha meno di 2 record.

1
SELECT age 
    , name 
FROM users 

UNION 

SELECT 25 As age 
    , 'Betty' As name 
WHERE EXISTS (
     SELECT Count(*) 
     FROM users 
     HAVING Count(*) >= 2 
     ) 
; 
Problemi correlati