Come verificare i valori nulli / vuoti / spazi bianchi con un singolo test?


88

Vorrei scrivere un'istruzione SELECT che utilizzi un solo test per restituire colonne senza valore (null, vuoto o tutti gli spazi).

Ho pensato che avrebbe funzionato:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Ma questo non funziona per i valori NULL.

Ovviamente posso aggiungere

OR column_name IS NULL

e funzionerà, ma mi piacerebbe un modo che utilizzi un singolo test.



Non è auspicabile avere più test? ovvero maggiore granularità = migliore feedback per gli utenti su come correggere i dati.
giorno

@onedaywhen: in generale potrebbe essere meglio avere una maggiore granularità, ma sto lavorando con una base di codice esistente e voglio imitare la struttura del codice esistente il più fedelmente possibile. Il codice attuale esegue un solo test, quindi stavo cercando una soluzione che avesse anche un solo test.
John Gordon

Risposte:


101

Funzionalmente, dovresti essere in grado di usare

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Il problema è che un indice su COLUMN_NAME non verrebbe utilizzato. Dovresti avere un indice basato sulla funzione su TRIM (nome_colonna) se questa è una condizione selettiva.


32
Nota per utenti T-SQL: non c'è TRIM, avrai bisogno di LTRIM o RTRIM.
demoncodemonkey

11
Da SQL Server 2017 è disponibile una funzione TRIM. Fonte
bvwidt

1
@ EhMann365 questa domanda riguarda Oracle, non Sql Server.
MH

11
RTRIM (LTRIM (column_name)) - Per utenti Microsft SQL.
DxTx

4
In Sql Server TRIM (nome_colonna) restituisce una stringa vuota "", non NULL. Altre risposte supportano sia la stringa vuota che NULL
Michael Freidgeim,

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') restituirà "" se nome_colonna è NULL, altrimenti restituirà nome_colonna.

AGGIORNARE

In Oracle, puoi utilizzare NVLper ottenere gli stessi risultati.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
in realtà questo ancora non funziona in Oracle, Oracle tratta le stringhe vuote come NULL, quindi potresti non avere una clausola "non mi piace" "poiché sta confrontando con un valore nullo
Harrison

Non vorrei "MI PIACE" invece di "NON MI PIACE"?
John Gordon,

Sì, scusa, ho letto male la domanda originale come se volessi tutto ciò che ha un valore. Ma come ha sottolineato Tanging, non sembra che questo funzionerà in Oracle.
GendoIkari

Dato che sto usando Oracle, sembra che posso usare WHERE TRIM (col) IS NULL e questo si prenderà cura dei valori null, blank e whitespace.
John Gordon

Ovviamente, la prima parte manca una parentesi, dovrebbe essere:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

15

La funzione NULLIF convertirà qualsiasi valore di colonna con solo spazi bianchi in un valore NULL. Funziona per T-SQL e SQL Server 2008 e versioni successive.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
Una buona risposta conterrebbe una spiegazione del codice e del motivo per cui è stato scritto in questo modo. Ti consiglio di aggiornare la tua risposta :-)
Qirel

1
Qual è il punto di questo? Sarebbe più efficiente impostarlo semplicemente su [nome_colonna] MI PIACE ''
SILENZIOSO

Ha bisogno di TRIM per supportare più spazi bianchi
Michael Freidgeim,

1
Test su SQL Server 2017, funziona per più spazi bianchi senza TRIM. Non ha senso per me, perché secondo la documentazione NULLIF dovrebbe restituire NULL solo se le due espressioni sono uguali e una stringa di spazi di solito non è uguale a una stringa vuota. (Ho testato solo gli spazi, non le tabulazioni, i caratteri di ritorno a capo o altri caratteri di spazio bianco.)
Jovie

1
@Jovie SQL Server a volte ignora gli spazi vuoti finali, leggi: stackoverflow.com/questions/17876478/…
Brian MacKay

7

Durante il controllo del null or Emptyvalore per una colonna, ho notato che ci sono alcuni problemi di supporto in vari database.

Ogni database non supporta TRIM metodo.

Di seguito è riportata la matrice solo per comprendere i metodi supportati da diversi database.

La funzione TRIM in SQL viene utilizzata per rimuovere il prefisso o il suffisso specificato da una stringa. Il motivo più comune rimosso sono gli spazi bianchi. Questa funzione viene chiamata in modo diverso nei diversi database:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracolo: RTRIM(), LTRIM()
  • Server SQL: TRIM(), RTRIM(), LTRIM()

Come controllare spazi vuoti / nulli / bianchi: -

Di seguito sono riportati due modi diversi a seconda dei diversi database:

La sintassi per queste funzioni di taglio è:

  1. Uso di Trim per controllare

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Uso di LTRIM e RTRIM per controllare

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Entrambi i metodi forniscono lo stesso risultato solo da utilizzare in base al supporto del DataBase. Restituisce solo la tabella FirstNamefrom UserDetailsse ha un vuotoLastName

Spero che questo possa aiutare anche gli altri :)


WITH t as (select '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; non ha restituito 3 record su SQL server
Waqar

5
Perché dovrebbero essere necessari sia L che RTRIM? Non sarebbe sufficiente una sola delle funzioni per verificare se la colonna è vuota?
SILENZIOSO

4

Questa query phpMyAdmin restituisce quelle righe, che NON sono nulle o vuote o solo spazi bianchi:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

se vuoi selezionare righe che sono nulle / vuote / solo spazi bianchi, rimuovi semplicemente NOT.


2

Usa la query sottostante e funziona

SELECT column_name FROM table_name where isnull(column_name,'') <> ''

0

Quello che uso per IsNotNullOrEmptyOrWhiteSpaceT-SQL è:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

0

Il suggerimento di ogni singola persona di eseguire una query in Oracle per trovare record il cui campo specifico è solo vuoto (questo non include (null) o qualsiasi altro campo solo una riga vuota) non ha funzionato. Ho provato ogni singolo codice suggerito. Immagino che continuerò a cercare online.

*****AGGIORNARE*****

Ho provato questo e ha funzionato, non sono sicuro del motivo per cui non funzionerebbe se <1 ma per qualche motivo <2 ha funzionato e ha restituito solo record il cui campo è solo vuoto

selezionare [columnName] da [tableName] dove LENGTH (columnName) <2;

Immagino che qualsiasi script utilizzato per convertire i dati abbia lasciato qualcosa nel campo anche se risulta vuoto, questa è comunque la mia ipotesi sul motivo per cui <2 funziona ma non <1

Tuttavia, se nel campo della colonna sono presenti altri valori inferiori a due caratteri, potrebbe essere necessario trovare un'altra soluzione. Se non ci sono molti altri personaggi, puoi individuarli.

Spero che la mia soluzione aiuti qualcun altro là fuori un giorno.


-3

Come in Oracle puoi usare la funzione NVL in MySQL puoi usare IFNULL (columnaName, newValue) per ottenere il risultato desiderato come in questo esempio

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

Puoi usare

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
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.