none
Aggiungere where solo se una variabile è diversa da 0 RRS feed

  • Domanda

  • Salve,

    devo fare un semplice SELECT da DB: SELECT * FROM TABELLA WHERE ID_TABELLA = @ID_TABELLA.

    Solo che se @ID_TABELLA è 0 voglio prendere tutte le righe come se il WHERE non ci fosse. Mi servirebbe qualcosa come '%' per i numeri.

    Come posso fare?

    Grazie.


    • Modificato y_chen giovedì 18 ottobre 2012 10:28
    giovedì 18 ottobre 2012 10:23

Risposte

Tutte le risposte

  • Salve,

    SELECT da DB: SELECT * FROM TABELLA WHERE ID_TABELLA = @ID_TABELLA or @ID_TABELLA = 0


    Regards, Nico

    • Contrassegnato come risposta y_chen giovedì 18 ottobre 2012 10:29
    giovedì 18 ottobre 2012 10:25
  • Grazie mille, funziona.
    giovedì 18 ottobre 2012 10:29
  • Grazie mille, funziona.

    E il piano d'esecuzione? Attento alle performance di una query così. Poi lo so bene, come l'sql dinamico, quando ci vuole ci vuole :)
    venerdì 19 ottobre 2012 14:34
  • sara' probabilmente un clustered index scan, tipico in questo scenario, mentre nel caso di un puro "WHERE Id = @param" si avrebbe un probabile Index seek...

    lo scan dipende dall'impossibilita' da parte dell'optimizer di effettuare la shortcircuit evaluation della comparazione globale del predicato, ed entrambe le comparazioni vengono sempre effettuate, visto che il piano di esecuzione viene generato dall'algebrizer prima della valutazione dei parametri, e quindi deve essere generato un piano valido che soddisfi completamente la ricerca, e lo scan e' ovviamente la soluzione sempre piu' conveniente per il caso specifico non comportando lookup... tecnicamente, dal puro punto di vista prestazionale, converrebbe innestare un blocco condizionale, tipo

    IF @Id = 0
      SELECT .. FROM ... ORDER BY ..;
    ELSE
      SELECT .. FROM ... WHERE Id = @Id ORDER BY ..;

    visto che questo consente lo spezzamento della generazione di un unico piano in un albero di piani stessi che vengono valutati secondo il parametro e quindi effettivamente utilizzando il piano appropriato secondo la relativa valorizzazione... per @Id = 0 verra' generato un sub-piano con clustered index scan (o comunque uno scan), mentre per @Id <> 0 sara' utilizzanto un index seek con susseguente key lookup...

    per un singolo parametro si potrebbe/dovrebbe tranquillamente fare, mentre il problema si evidenza con prepotenza quando il numero di parametri cresce, vista la crescita mostruosa potenziale di blocchi condizionali eventualmente richiesti :)

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    sabato 20 ottobre 2012 17:13
    Moderatore