Domanda

Query semplice, forse impossibile, ma so che ci sono alcune persone intelligenti là fuori:)

Dato un parametro booleano, desidero definire la mia clausola dove sia limitare l'uscita di una certa colonna -. O non fare nulla

Quindi, dato parametro @bit = 1 questo sarebbe il risultato:

dove colonna = 1

dato parametro @bit = 0 questo sarebbe il risultato:

dove colonna = 1 o 0

vale a dire. non hanno alcun effetto / mostrare tutti i risultati (colonna è un campo di bit)

Non sto volendo SQL dinamico -. Posso accontentarsi di fissare questo nel codice, ma mi chiedevo se c'è qualche magia intelligente che avrebbe fatto quanto sopra pulito e semplice

C'è? Sto utilizzando server SQL.

applausi: D

È stato utile?

Soluzione

La risposta column = 1 or @bit = 0 funziona se colonna può essere solo 0 o 1. Se colonna può essere qualsiasi valore che si desidera:. column = 1 or @bit = 0 and column = 0

Altri suggerimenti

SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

Se si dispone di un indice su column1, questo sarà più efficiente:

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

Si veda questo articolo nel mio blog per il confronto delle prestazioni di un singolo WHERE condizione vs UNION ALL:

where column BETWEEN @bit AND 1
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)

ero venuto su con una risposta diversa e sentito muto quando vedendo la risposta di consenso. Così, solo per yucks, rispetto i due usando il mio proprio database. Io non so davvero se sono veramente confrontabili, ma i miei piani di esecuzione dare un leggero vantaggio per la mia risposta goofy:

selezionare
* da
MyTable dove la colonna <> caso @bit quando 1 ora 0 altrimenti -1 fine

Mi rendo conto indici, dimensione della tabella, ecc può influire su questo.
Inoltre, è realizzato probabilmente non si può paragonare un po 'a un -1 ...
Ho pensato di condividere.

provare questo

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

questo funziona non importa quale sia il tipo di dati di colonna è (potrebbe anche essere una stringa, per esempio). Se lo fosse, ovviamente, sarebbe un valore predefinito diverso (non 0)

WHERE colonna> = @bit

Tuttavia, questo funziona solo per> 0 valori in una colonna numerica. @bit saranno implicitamente in int, smallint ecc a causa del tipo di dati la precedenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top