2010-11-05 9 views
41

Vorrei scrivere un'istruzione SELECT che utilizza un solo test per restituire colonne senza valore (null, vuoto o tutti gli spazi).Come verificare i valori null/empty/spazi bianchi con un singolo test?

Ho pensato che questo avrebbe funzionato:

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

Ma questo non funziona per i valori NULL.

Certo che posso aggiungere

OR column_name IS NULL 

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

+0

Sto usando Oracle 10g. –

+1

Correlati: http://stackoverflow.com/questions/4042496/how-should-i-deal-with-null-parameters-in-a-pl-sql-stored-procedure-when-i-want-t/4042572 # 4042572 –

+0

Non è consigliabile avere più test? più granularità = miglior feedback agli utenti su come correggere i dati. – onedaywhen

risposta

54

punto di vista funzionale, si dovrebbe essere in grado di utilizzare

SELECT column_name 
    FROM table_name 
WHERE TRIM(column_name) IS NULL 

Il problema non è che un indice su COLUMN_NAME non sarebbe stato utilizzato. È necessario disporre di un indice basato su funzione su TRIM (nome_colonna) se si tratta di una condizione selettiva.

+17

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

+2

Poiché ** SQL Server 2017 ** è presente una funzione TRIM. [Fonte] (https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql) – EhMann365

+0

@ EhMann365 questa domanda riguarda Oracle, non il server Sql. –

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

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

UPDATE

In Oracle, è possibile utilizzare NVL per ottenere gli stessi risultati.

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

in realtà questo non funziona ancora in Oracle, Oracle considera le stringhe vuote come NULL in modo da non avere una clausola di "non come" "dal momento che si confronta con un valore nullo – Harrison

+0

Non vorrei MI PIACE" "invece di NON PIACE '' ? –

+0

Sì, mi dispiace, ho letto erroneamente la domanda originale come volendo tutto ciò che ha un valore. Ma come sottolineato, non sembra che funzionerà in Oracle. – GendoIkari

-1

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

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

Quello che uso per IsNotNullOrEmptyOrWhiteSpace in T-SQL è:

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

è possibile utilizzare

SELECT [column_name] 
FROM [table_name] 
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL 
0

La funzione NULLIF convertirà qualsiasi colonna valore con solo spazi bianchi in un valore NULL. Funziona con T-SQL e SQL Server 2008 & su.

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

Una buona risposta conterrebbe una spiegazione del codice e perché è stata scritta in questo modo. Vi consiglio di aggiornare la risposta :-) – Qirel

+0

Aggiornamento della risposta – MerrickPlainview

+0

Qual è il punto di questo? Sarebbe più efficiente impostarlo su [column_name] LIKE '' – SILENT

3

Mentre controlla null or Empty valore per una colonna, ho notato che vi sono preoccupazioni di supporto in diverse banche dati.

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 modello più comune rimosso è spazi bianchi.Questa funzione viene chiamata in modo diverso in diversi database:

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

come controllare Vuoto/Null/Whitespace: -

Qui di seguito sono due modi diversi a seconda delle diverse Databases-

La sintassi di queste funzioni di allestimento sono:

  1. L'utilizzo di Trim per check-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. L'uso della LTRIM & RTRIM al check-

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

Sopra entrambi i modi forniscono stesso risultato basta usare in base al supporto di database. Esso restituisce solo il FirstName da UserDetails tavolo se ha un vuoto LastName

Sperando che questo aiuterà anche gli altri :)

+0

WITH t as (seleziona '' c union all select '' c union seleziona tutto NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) È NULL ; non ha restituito 3 record sul server SQL – Waqar

+1

Perché sarebbe necessario sia L & RTRIM? Non solo una delle funzioni è sufficiente per verificare se la colonna è vuota? – SILENT

0

Questa query phpMyAdmin sta tornando le 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 si desidera selezionare righe vuote/vuote/solo spazi vuoti basta rimuovere NOT.

Problemi correlati