Dovrei usare! = O <> per non uguale in T-SQL?


801

Ho visto SQLche usa entrambi !=e <>per non essere uguali . Qual è la sintassi preferita e perché?

Mi piace !=, perché <>mi ricorda Visual Basic.



Portabilità del codice. Se i tuoi requisiti sono facilmente soddisfatti da ANSI SQL, è meglio usarlo. È possibile utilizzare lo stesso codice in tutti i DB. Per esempio. Un autore di libri SQL che desidera illustrare l'SQL di base utilizzando il codice di esempio.
Steam,

1
Vorrei aggiungere un esempio in cui avere solo il codice ANSI SQL può essere un problema: SQL standard supporta le opzioni NULLS FIRST e NULLS LAST per controllare l'ordinamento di NULL, ma T-SQL non supporta questa opzione.
Steam

Non è necessario riaprire. La domanda marcata è un duplicato, appena prorogato di ancora un altro opzione NOT (A = B).
TLama,

@Steam, dovresti specificare a quale versione dell'anno di ansi sql fai esattamente riferimento. Alcune di queste versioni richiedono persino di specificare la compatibilità di livello o le parti esatte dello standart. Chi di loro ha introdotto NULLS FIRST e NULLS LAST?
Gherman,

Risposte:


539

Tecnicamente funzionano allo stesso modo se si utilizza SQL Server AKA T-SQL. Se lo si utilizza nelle procedure memorizzate, non vi è alcun motivo di prestazioni da utilizzare l'uno sull'altro. Si riduce quindi alle preferenze personali. Preferisco usare <> in quanto è conforme ANSI.

Puoi trovare link ai vari standard ANSI su ...

http://en.wikipedia.org/wiki/SQL


41
Ho sempre preferito usare a !=causa della sua esistenza in ogni linguaggio influenzato dalla C che ho usato, e perché la documentazione di Python dice: "I moduli <>e !=sono equivalenti; per coerenza con C, !=è preferito; dove !=è menzionato di seguito <>è anche accettato. L' <>ortografia è considerata obsoleta ". Ma SQL non è Python!
Iain Samuel McLean Elder il

24
Mi piace usare <> perché mi ricorda XML. Ma SQL non è XML!
Rob Grant,

32
Sì; Microsoft stessa consiglia di utilizzare <>più !=specificamente per la conformità ANSI, ad esempio nel kit di formazione Microsoft Press per l'esame 70-461, "Interrogazione di Microsoft SQL Server", dicono "Come esempio di quando scegliere il modulo standard, T-SQL supporta due" non uguale a "operatori: <> e! =. Il primo è standard e il secondo no. Questo caso dovrebbe essere un nobrainer: scegli quello standard!"
Matt Gibson,

10
Mi piace <> perché è più facile da scrivere.
user2023861

731

La maggior parte dei database supporta !=(linguaggi di programmazione popolari) e <>(ANSI).

Database che supportano entrambi !=e <>:

  • MySQL 5.1: !=e<>
  • PostgreSQL 8.3: !=e<>
  • SQLite: !=e<>
  • Oracle 10g: !=e<>
  • Microsoft SQL Server 2000/2005/2008/2012/2016: !=e<>
  • IBM Informix Dynamic Server 10: !=e<>
  • InterBase / Firebird: !=e<>
  • Apache Derby 10.6: !=e<>
  • Sybase Adaptive Server Enterprise 11.0: !=e<>

Database che supportano l'operatore standard ANSI, esclusivamente :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

Django ORM esegue la query su NOT (a = b)invece di (a <> b)o (a != b). È lo stesso internamente?
utente

7
@buffer, sono logicamente uguali, ovvero corrisponderebbe o escluderebbe lo stesso insieme di righe. Ma se un particolare marchio RDBMS lo ottimizza lo stesso dipende dall'implementazione. Detto questo, sarei sorpreso se ci fossero differenze tra le marche di database.
Bill Karwin,

nota a margine: LINQ in C # devi usare! =
Tom Stickel,

! = è supportato da IBM DB2 LUW 10.5+
Cristi S.

10
@TomStickel LINQ in C # non è SQL.
Craig,

109

'<>'proviene dallo standard SQL-92 ed '!='è un operatore proprietario T-SQL. È disponibile anche in altri database, ma poiché non è standard è necessario prenderlo caso per caso.

Nella maggior parte dei casi, saprai a quale database ti stai connettendo, quindi questo non è davvero un problema. Nel peggiore dei casi potresti dover effettuare una ricerca e sostituirla nel tuo SQL.


Ho visto anche mysql sql usarlo
Bob The Janitor,

3
Possiamo continuare a chiamare un'estensione così diffusa della lingua standard come proprietaria ? A questo punto, sembra solo che lo standard debba essere aggiornato per richiedere, o almeno consentire entrambe le sintassi.
Johan Boulé,

3
@JohanBoule bene, esiste uno standard scritto per SQL e per quanto ne !=so non ne fa parte. Anche se per tutti gli scopi pratici è uno standard defacto, non dovremmo confondere ciò che sono e non sono caratteristiche standard.
Adam Lassek,



24

Questo è specifico di SQL Server. Certo, chiede di SQL Server, ma puoi trovare un riferimento alle specifiche ANSI per vedere se è garantito che sia portatile per quelli di noi a cui piace sapere quel genere di cose?
Joel Coehoorn,

6
@Joel Coehoorn, se porti il ​​tuo codice T-SQL "<>" e "! =" Saranno le tue preoccupazioni !!
KM.

1
Il porting non è il problema: è quando, come sviluppatore, devi passare da un ambiente all'altro. La coerenza è buona.
Mark Ransom,

20

Sembra che Microsoft si preferiscono <>a !=come evidenziato nei loro vincoli di tabella. Personalmente preferisco usarlo !=perché l'ho letto chiaramente come "non uguale", ma se lo inserisci [field1 != field2]e lo salvi come un punto di forza, la prossima volta che lo interrogherai, verrà visualizzato come [field1 <> field2]. Questo mi dice che il modo corretto di farlo è <>.


15

!=, pur non essendo ANSI, è più nel vero spirito di SQL come linguaggio leggibile. Urla non uguale. <>dice che è per me (minore di, maggiore di) che è semplicemente strano. So che l'intenzione è che sia minore o maggiore di quindi non uguale, ma questo è un modo davvero complicato di dire qualcosa di veramente semplice.

Ho dovuto solo prendere alcune lunghe query SQL e inserirle amorevolmente in un file XML per tutta una serie di stupide ragioni che non affronterò.

Basti pensare che l'XML non è affatto negativo <>e ho dovuto cambiarli !=e controllarmi prima di distruggermi.


6
perché non solo CDATA esso? cosa succede quando la tua query contiene XML?
Janus Troelsen,

12

Puoi usare quello che preferisci in T-SQL. La documentazione afferma che entrambi funzionano allo stesso modo. Preferisco !=, perché legge "non uguale" alla mia mente (basata su C / C ++ / C #), ma i guru del database sembrano preferire <>.


10

Comprendo che la sintassi C si !=trova in SQL Server a causa della sua eredità Unix (ai tempi di Sybase SQL Server, pre Microsoft SQL Server 6.5).


7

Un'alternativa sarebbe quella di utilizzare l'operatore NULLIF diverso <>o !=che restituisce NULL se i due argomenti sono uguali NULLIF in Microsoft Docs . Quindi credo che la clausola WHERE possa essere modificata per <>e !=come segue:

NULLIF(arg1, arg2) IS NOT NULL

Come ho scoperto, in alcuni casi l' utilizzo <>e la !=data non funzionano per data. Quindi usare l'espressione sopra fa il necessario.


6
Non sono sicuro che questa funzione funzioni oltre <>all'utilizzo dell'indice in tutti i casi angolari. Inoltre, la leggibilità è sicuramente molto peggio ...
Lukas Eder il

Come ho detto nella risposta, questo ha funzionato per me nei campi relativi alle date nel 2014. Non sono sicuro di quale fosse la clausola / condizione che limitava le altre risposte, ma guardando alcuni dei voti, questo sembra aiutare anche altri.
jitendrapurohit,

1

Ho preferito usare !=invece di <>perché a volte uso la <s></s>sintassi per scrivere comandi SQL. L'uso !=è più utile per evitare errori di sintassi in questo caso.


-6

Entrambi sono accettati in T-SQL. Tuttavia, sembra che l'utilizzo funzioni <>molto più velocemente di!= . Ho appena eseguito una query complessa che stava utilizzando !=e ci sono voluti in media circa 16 secondi per l'esecuzione. Ho cambiato quelli in <>e la query ora richiede circa 4 secondi in media per l'esecuzione. Questo è un enorme miglioramento!


20
Se si eseguono due query simili una dopo l'altra in SQL Server, probabilmente i dati memorizzati nella cache saranno ottimizzati e ottimizzati per query simili. Se lo facessi nell'ordine inverso, potresti trovare il risultato opposto!
codemonkey

2
Anche questo è sbagliato, non avrebbero avuto due operatori che funzionavano esattamente allo stesso modo e uno era più lento "solo perché". Ci sono molti fattori che contribuiscono al perché la stessa query produrrà tempi di esecuzione diversi.
Elliot Chance,

-11

Sebbene funzionino allo stesso modo, !=significa esattamente "non uguale a", mentre<> significa maggiore e minore del valore memorizzato.

Prendi in considerazione >=o <=, e questo avrà senso quando il factoring nei tuoi indici alle query ... <>funzionerà più velocemente in alcuni casi (con l'indice giusto), ma in altri casi (senza indice) funzioneranno allo stesso modo.

Ciò dipende anche da come il sistema di database legge i valori !=e <>. Il provider del database può semplicemente collegarlo e farli funzionare allo stesso modo, quindi non ci sono vantaggi in entrambi i modi. PostgreSQL e SQL Server non lo fanno; viene letto come appare sopra.


3
Hai qualche riferimento a sostegno per la tua dichiarazione? Entrambi gli operatori sembrano essere esattamente gli stessi in PostgreSQL , Oracle e MySQL .
GhostGambler

8
Questo è completamente sbagliato, potrebbe sembrare "maggiore o minore del valore memorizzato" quando combini quei personaggi nella tua mente, ma per il lexer è solo un altro modo per rappresentare il token.
Elliot Chance,

Mancanza di risorse correlate!
mostafa8026,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.