È buona norma non filtrare i valori in base al nullability?

2

A volte quando creo un'API che dovrebbe abilitare il recupero di un singolo valore o di tutti i valori, utilizzo il seguente modello (passando NULL all'API, ovvero ottieni tutte le righe):

@Nomi utente - elenco separato da virgole di utenti

CREATE PROC GetUsers (@Usernames VARCHAR(100) = NULL)
AS
BEGIN
    SELECT *
    FROM Users
    Where @Usernames IS NULL OR dbo.in_list(@Usernames,Username) = 1 
END

È una buona pratica usare la condizione OR per ottenere entrambe le funzionalità, o dovrei scrivere qualcosa del genere:

CREATE PROC GetUsers (@Usernames VARCHAR(100) = NULL)
AS
BEGIN
    IF(@Username IS NULL)
    BEGIN
        SELECT *
        FROM Users
    END
    ELSE
    BEGIN
        SELECT *
        FROM Users
        Where dbo.in_list(@Usernames,Username) = 1 
    END
END

* Nota: Ad esempio, questo è solo SQL, questa non è una domanda specifica per la lingua di codifica . Grazie.

    
posta Yosi Dahari 27.09.2013 - 18:45
fonte

3 risposte

0

Il titolo della tua domanda è diverso dalla domanda nel tuo post, quindi cerco di rispondere a entrambe le domande.

IMHO è un idioma perfettamente valido per avere una funzione con una condizione di filtro opzionale, e quando si lascia fuori quel filtro, si ottiene il set di risultati non filtrato completo. Questo è vero sia per SQL che per molti altri linguaggi di programmazione.

Per quanto riguarda l'implementazione è meglio: la prima è più completa con meno ripetizioni dello stesso codice ( SELECT * FROM Users ) e meno codice boilerplate ( IF .. END ELSE ... ) - quindi in generale preferirei questo, poiché è chiaramente meglio mantenibile Solo se si soffre di una perdita imprevista di prestazioni, è possibile verificare se la seconda alternativa è più veloce. Questo probabilmente dipenderà dal tuo sistema di database (forse dalla versione), quindi fallo solo se sei sicuro al 100% che ne varrà la pena.

    
risposta data 27.09.2013 - 20:01
fonte
2

Crea un'altra procedura denominata GetEmployeesDetails .

La tua procedura si chiama GetEmployeeDetails , quindi la procedura dovrebbe fare solo una cosa: ottenere i dettagli di un dipendente.

Stai facendo fare altro da quello che dice il suo nome se restituisce qualcosa di diverso dai dettagli del un dipendente .

Di solito ciò che viene fatto è un GetEmployeesDetails che prende un parametro filter . Questo filtro può essere un hashmap, vuoto o non.

Questo è importante non farlo a modo tuo; il nome della tua procedura è fuorviante.

    
risposta data 27.09.2013 - 19:21
fonte
0

Nei linguaggi di programmazione delle applicazioni sono d'accordo con Doc Brown. Niente di sbagliato qui.

Per l'implementazione SQL, lo sniffing dei parametri potrebbe creare un po 'di devastazione qui. Consulta un abile DBA o leggi alcuni seri documenti sulla ricerca dinamica del tuo motore db di scelta per un migliore processo decisionale.

    
risposta data 27.09.2013 - 21:09
fonte

Leggi altre domande sui tag