In retrospettiva, è stata una buona idea utilizzare la logica a tre valori per i confronti NULL SQL?

7

In SQL, NULL significa "valore sconosciuto". Pertanto, ogni confronto con NULL restituisce NULL (sconosciuto) piuttosto che TRUE o FALSE.

Da un punto di vista concettuale, questa logica a tre valori ha senso. Da un punto di vista pratico, ogni studente di SQL ha, una volta o l'altra, reso l'errore classico WHERE myField = NULL o ha imparato a fondo che NOT IN non fa ciò che ci si aspetterebbe quando sono presenti valori NULL.

È mia impressione (correggimi se sbaglio) che i casi in cui questa logica a tre valori aiuta (ad esempio WHERE myField IS NOT NULL AND myField <> 2 può essere abbreviata in WHERE myField <> 2 ) sono rari e, in quei casi, le persone tendono a usa comunque la versione più lunga per chiarezza, proprio come se aggiungessi un commento quando usi un trucco intelligente e non ovvio.

C'è qualche ovvio vantaggio che mi manca? O c'è un consenso generale tra la comunità di sviluppo sul fatto che sia stato un errore?

    
posta Heinzi 07.11.2013 - 23:05
fonte

4 risposte

3

Penso che il nocciolo del problema sia che, oltre a "SCONOSCIUTO", si intende anche "NON APPLICABILE" o "ASSENTE" ad es. Hai una tabella PERSONS con SPOUSE_ID. Cosa metti in loro per una singola persona? Nella maggior parte dei casi un designer renderà questo campo Nullable da riempire con l'ID del partner quando disponibile e lasciato in bianco per single tristi e scapoli felici.

Nella mia esperienza questo è in realtà l'uso più comune per NULL. Quindi, mentre un confronto di due valori di UNKNOWN dovrebbe comportare un altro SCONOSCIUTO; un confronto tra due valori ABSENT dovrebbe comportare l'uguaglianza, ma SQL non lo consente.

Sarebbe stato banale aggiungere un altro operatore extra (ad esempio "==") alla massa di parole chiave e operatori SQL che indica che si desidera che 2 valori nulli siano considerati uguali.

Mentre penso che il modello relazionale sia solido e abbia un futuro molto lungo, penso che il pasticcio di SQL sia dovuto a un ripensamento totale. Sarebbe bello se potessimo ricominciare da capo e avere un'API basata sull'algebra relazionale originale di Codd.

    
risposta data 08.11.2013 - 02:14
fonte
1

Il problema qui è che NULL non è un valore - è un insieme nebuloso di valori e non sai quale sia. Impostare l'uguaglianza qui è privo di significato, perché quindi i valori non sarebbero NULL. Applica le basi matematiche dei database relazionali. In molti modi, è come chiedere perché infinity = infinity non è valido.

    
risposta data 08.11.2013 - 04:14
fonte
0

TRUE e FALSE fanno affermazioni sul contenuto di un valore. NULL indica la completa assenza di qualsiasi valore. Se NULL si comporta allo stesso modo di FALSE, non sarà possibile eseguire correttamente l'account per l'assenza di dati in una query, cosa che è molto importante in un database. Penso che da solo rende NULL abbastanza diverso da TRUE / FALSE che merita di essere gestito appositamente.

    
risposta data 08.11.2013 - 01:27
fonte
0

Questa sembra essere una domanda doppia ... link

Non penso sia un errore - questo comportamento è descritto nello standard ANSI.

La maggior parte dei database ti consente di modificare il comportamento dell'operatore di uguaglianza.

set ansi_nulls on
if null = null
   print 'this will not print' 
set ansi_nulls off
if null = null  
   print 'this should print'

Inoltre, è possibile notare che molti linguaggi di programmazione si aspettano una semantica simile quando si confrontano oggetti con valori nulli.

    
risposta data 08.11.2013 - 00:56
fonte

Leggi altre domande sui tag