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.


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:



27

Vous pouvez simplement faire ceci:

SELECT *
FROM   yourTable
WHERE  yourColumn IS NULL OR yourColumn = ''

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.


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)) = ''

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)),'')<>''

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,'') = '';

3

C'est moche MSSQL:

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

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


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


1
SELECT *
FROM   Table
WHERE  column like '' or column IS NULL OR LEN(column) = 0

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,'') = ''

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

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'

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)


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()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.