Come posso verificare se una colonna di testo di SQL Server è vuota?


183

Sto usando SQL Server 2005. Ho una tabella con una colonna di testo e ho molte righe nella tabella in cui il valore di questa colonna non è nullo, ma è vuoto. Cercare di confrontare '' produce questa risposta:

I tipi di dati text e varchar sono incompatibili con l'operatore non uguale a.

Esiste una funzione speciale per determinare se il valore di una colonna di testo non è nullo ma vuoto?


1
Vorrei convertire il tipo di dati, se possibile, in varchar (max), il testo è stato deprecato - è meglio iniziare subito a fare le modifiche se si tocca la tabella. Verifica con il tuo dba ovviamente. Ma più cose possono essere convertite prima che debbano essere convertite, meglio è il mio pensiero. Dipenderà dalla quantità di codice che hai usando cose come contiene e scrivi del testo che verrà interrotto sul fatto di farlo ora, ma lo faccio apparire, quindi sei consapevole che alla fine sarà necessario cambiarlo.
HLGEM,

Risposte:


304
where datalength(mytextfield)=0

2
Questa non era la vera domanda, ma solo un'osservazione per le persone che leggono solo il titolo, non dimenticare di aggiungere OR mytextfield IS NULLquando la tua rubrica può essereNULL
Daan,

2
mytextfield IS NULL *OR*:-)
divieto di geoingegneria il

3
@ ban-geoengineering SQL Server T-SQL non rispetta le tecniche di valutazione del corto circuito, quindi l'ordine qui non influenza il risultato.
Conrad,

47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1

La query sopra gestirà effettivamente la natura di nullità e vacuità di una colonna di testo e assegnerà di conseguenza un valore basato sulla condizione. Voto per la risposta poiché questo è quello che stavo cercando. Grazie
user_v

28

In realtà, devi solo usare l'operatore LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Preferisco questa risposta alle altre qui perché non si basa sull'overhead aggiunto della chiamata di funzioni SQL come DataLength (), IsNull () o Cast (). Forse il piano di query generato è lo stesso (non ho controllato); trovo comunque che questo sia un approccio molto più pulito.
MikeTeeVee,

5

Per ottenere solo valori vuoti (e non valori null):

SELECT * FROM myTable WHERE myColumn = ''

Per ottenere sia valori nulli che vuoti:

SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''

Per ottenere solo valori null:

SELECT * FROM myTable WHERE myColumn IS NULL

Per ottenere valori diversi da null e vuoto:

SELECT * FROM myTable WHERE myColumn <> ''


E ricorda di usare frasi LIKE solo quando necessario perché degraderanno le prestazioni rispetto ad altri tipi di ricerche.


Non intendi myColumn IS NOT NULL AND my column = '';?
bcsb1001,

2

Utilizzare l'operatore IS NULL:

Select * from tb_Employee where ename is null

1
atoumey afferma nella domanda che "il valore di questa colonna non è nullo, ma è vuoto" quindi ISNULL () non funzionerebbe :)
GazB

2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''

1
votato, ma ... dove ISNULL (TRIM (Field), '') = '' è ancora meglio ;-), se ritieni che "" sia una stringa vuota anche con spazi all'interno
Kirsten,

Per MySQL la sintassi corretta è:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva,

1

So che questo post è antico ma l'ho trovato utile.

Non ha risolto il mio problema di restituzione del record con un campo di testo non vuoto, quindi ho pensato di aggiungere la mia soluzione.

Questa è la clausola where che ha funzionato per me.

WHERE xyz LIKE CAST('% %' as text)



0

Sono null e una stringa vuota equivalenti? In tal caso, includerei la logica nella mia applicazione (o forse un trigger se l'app è "pronta all'uso"?) Per forzare il campo a essere nullo o '', ma non l'altro. Se hai scelto "", puoi impostare anche la colonna su NOT NULL. Solo una questione di pulizia dei dati.


0

Volevo avere un testo predefinito ("Nessun laboratorio disponibile") da visualizzare se il valore era nullo o vuoto e il mio amico mi ha aiutato con questo:

StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                            THEN cast((S.UnitsOrdered) as varchar(50))
                    ELSE 'No Labs Available'
                    END

Wow, una sottoquery. Non è affatto costoso.
Jay Croghan,

0

Devi fare entrambe le cose:

SELECT * FROM Table WHERE Text IS NULL or Text LIKE ''


0

So che ci sono molte risposte con alternative a questo problema, ma vorrei solo mettere insieme quella che ho trovato come la migliore soluzione di @Eric Z Beard & @Tim Cooper con @Enrique Garcia & @Uli Köhler.

Se necessario per affrontare il fatto che solo lo spazio potrebbe essere uguale a vuoto nello scenario del caso d'uso, poiché la query seguente restituirà 1, non 0.

SELECT datalength(' ')

Pertanto, sceglierei qualcosa del tipo:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))


0

Invece di usare isnullusa a case, a causa delle prestazioni è meglio il caso.

case when campo is null then '' else campo end

Nel tuo problema devi fare questo:

case when campo is null then '' else
  case when len(campo) = 0 then '' else campo en
end

Codice come questo:

create table #tabla(
id int,
campo varchar(10)
)

insert into #tabla
values(1,null)

insert into #tabla
values(2,'')

insert into #tabla
values(3,null)

insert into #tabla
values(4,'dato4')

insert into #tabla
values(5,'dato5')

select id, case when campo is null then 'DATA NULL' else
  case when len(campo) = 0 then 'DATA EMPTY' else campo end
end
from #tabla

drop table #tabla

per prima cosa controlla se è null, quindi usi la funzione len ... spero che ti aiuti
Enrique Garcia

Cosa succede se la colonna non è NULL e vuota, senza testo?
Ha detto Muhammad Idrees il

0
DECLARE @temp as nvarchar(20)

SET @temp = NULL
--SET @temp = ''
--SET @temp = 'Test'

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
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.