Comment utiliser NULL ou une chaîne vide dans SQL

129

Je voudrais savoir comment utiliser NULL et une chaîne vide en même temps dans une WHEREclause dans SQL Server. J'ai besoin de trouver des enregistrements qui ont des valeurs nulles ou une chaîne vide. Merci.

Poshan
la source
5
Il y a un mot clé OR dans SQL.
Robert Harvey
13
Cette question ne montre aucun effort de recherche. Il est important de faire vos devoirs . Dites-nous ce que vous avez trouvé et pourquoi il ne répond pas à vos besoins. Cela démontre que vous avez pris le temps d'essayer de vous aider, cela nous évite de réitérer des réponses évidentes, et surtout cela vous aide à obtenir une réponse plus précise et pertinente. FAQ .
Kermit
1
duplication possible de Comment sélectionner les données de la table MySQL où une colonne est NULL (c'était une question MySQL, mais c'est fondamentalement la même réponse pour t-sql)
Michael Berkowski

Réponses:

234
Select *
From Table
Where (col is null or col = '')

Ou

Select *
From Table
Where IsNull(col, '') = ''
codingbadger
la source
14
selon la réponse de @Bradc dans ce stackoverflow.com/questions/799584/… , mieux vaut utiliser la première approche.
Sameera R.
27

Vous pouvez simplement faire ceci:

SELECT *
FROM   yourTable
WHERE  yourColumn IS NULL OR yourColumn = ''
Praveen Nambiar
la source
25

Si vous en avez besoin dans la section SELECT , vous pouvez utiliser comme ceci.

    SELECT  ct.ID, 
            ISNULL(NULLIF(ct.LaunchDate, ''), null) [LaunchDate]
    FROM    [dbo].[CustomerTable] ct

vous pouvez remplacer le nullpar votre valeur de substitution.

Sameera R.
la source
1
La NVL d'Oracle (var1, 'value') se chargera du remplacement de la chaîne vide ''. Isnull (var1, 'value') de T-SQL ne le fait pas.
Jenna Leaf
15
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''
John Woo
la source
2
SELECT * FROM TableName WHERE columnNAme IS NULL OU RTRIM (columnName) = ''
Xavier John
2
Comme le souligne Xavier, il n'est pas nécessaire de faire les deux ltrimet rtrimsi le but est simplement de comparer à une chaîne vide. RAISON: s'il y a UNIQUEMENT des espaces, une seule garniture enlèvera tout. Par exemple, vous ne vous souciez pas de savoir si la comparaison échoue car ce qui reste est "abc" ou "abc".
ToolmakerSteve
8

Pour trouver les lignes où se trouve col NULL, une chaîne vide ou un espace (espaces, tabulations):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')=''

Pour trouver les lignes où se trouve col NOT NULL, une chaîne vide ou un espace (espaces, tabulations):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')<>''
Scott Sterling
la source
7

Quelques méthodes sargables ...

SELECT *
FROM #T
WHERE SomeCol = '' OR SomeCol IS NULL;

SELECT *
FROM #T
WHERE SomeCol = '' 
UNION ALL
SELECT *
FROM #T
WHERE  SomeCol IS NULL;

SELECT *
FROM #T
WHERE EXISTS ((SELECT NULL UNION SELECT '') INTERSECT SELECT SomeCol);

Et certains non sargables ...

SELECT *
FROM #T
WHERE IIF(SomeCol <> '',0,1) = 1;

SELECT *
FROM #T
WHERE NULLIF(SomeCol,'') IS NULL;

SELECT *
FROM #T
WHERE ISNULL(SomeCol,'') = '';
Martin Smith
la source
3

C'est moche MSSQL:

CASE WHEN LTRIM(RTRIM(ISNULL([Address1], ''))) <> '' THEN [Address2] ELSE '' END
ADMETTRE
la source
3

ma meilleure solution:

 WHERE  
 COALESCE(char_length(fieldValue), 0) = 0

COALESCE renvoie la première expr non nulle dans la liste d'expressions ().

si le fieldValue est nul ou une chaîne vide alors: nous retournerons le deuxième élément puis 0.

donc 0 est égal à 0, alors cette valeur de champ est une chaîne nulle ou vide.

en python par exemple:

def coalesce(fieldValue):
    if fieldValue in (null,''):
        return 0

bonne chance

Anouar Mokhtari
la source
2

vous vérifiez null avec IS NULL et la chaîne vide avec LEN (RTRIM (LTRIM (Column))) = 0 in

SELECT *
FROM AppInfra.Person
WHERE   LEN(RTRIM(LTRIM(NationalCode))) = 0 OR  NationalCode IS NULL
Alireza Shabani
la source
2
select 
   isnull(column,'') column, * 
from Table  
Where column = ''
Chandu Komati
la source
1
SELECT *
FROM   Table
WHERE  column like '' or column IS NULL OR LEN(column) = 0
Charaf JRA
la source
1

Vous pouvez utiliser la isnullfonction pour obtenir à la fois nullles valeurs vides d'un champ de texte:

SELECT * FROM myTable
WHERE isnull(my_nullable_text_field,'') = ''
Alberto De Caro
la source
La fonction isnull vérifie littéralement si la valeur est nulle. Cela ne fonctionnera pas si la chaîne est vide ("").
Max Pringle
@Max Pringle. Je ne dis pas différemment. Le code fourni répond également à la demande de question. Je ne suis pas sûr de votre contribution. Suggérer une modification au lieu de voter contre.
Alberto De Caro
suivra vos conseils. J'ai mis une modification suggérée maintenant. Cette clause where obtient uniquement les valeurs nulles et non les valeurs de chaîne vides. Un nullif pourrait être utilisé pour obtenir les valeurs vides.
Max Pringle
1
--setup
IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T;
CREATE TABLE #T(ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, NAME VARCHAR(10))
INSERT INTO #T (Name) VALUES('JOHN'),(''),(NULL);
SELECT * FROM #T
 1  JOHN
 2  -- is empty string
 3  NULL

Vous pouvez examiner ''comme NULLen le convertissant en NULLutilisantNULLIF

--here you set '' to null
UPDATE #T SET NAME = NULLIF(NAME,'')
SELECT * FROM #T 
 1  JOHN
 2  NULL
 3  NULL

ou vous pouvez examiner NULLen ''utilisantSELECT ISNULL(NULL,'')

-- here you set NULL to ''
UPDATE #T SET NAME = ISNULL(NULL,'') WHERE NAME IS NULL
SELECT * FROM #T
1   JOHN
2   -- is empty string
3   -- is empty string

--clean up
DROP TABLE #T
BTE
la source
1

Dans sproc, vous pouvez utiliser la condition suivante:

DECLARE @USER_ID VARCAHR(15)=NULL --THIS VALUE IS NULL OR EMPTY DON'T MATTER
IF(COALESCE(@USER_ID,'')='')
PRINT 'HUSSAM'
mohammed hussamuddin hussamudd
la source
1

par cette fonction:

ALTER FUNCTION [dbo].[isnull](@input nvarchar(50),@ret int = 0)
RETURNS int
AS
BEGIN

    return (case when @input='' then @ret when @input is null then @ret else @input end)

END

et utilisez ceci:

dbo.isnull (valeur, 0)

Mohsen.Sharify
la source
1
SELECT * FROM DBO.AGENDA
WHERE 
  --IF @DT_START IS NULL OR EMPTY
  ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) -- GET ALL DATE
  OR --ELSE
  ( DT_START >= @DT_START ) --FILTER

-- MORE FILTER

SELECT * FROM DBO.AGENDA
WHERE 
  ( ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) OR ( DT_START >= @DT_START ) ) 
  AND
  DT_END < GETDATE()
Vinicius.Beloni
la source