Verwendung von NULL oder leerer Zeichenfolge in SQL


129

Ich möchte wissen, wie NULL und eine leere Zeichenfolge gleichzeitig in einer WHEREKlausel in SQL Server verwendet werden. Ich muss Datensätze finden, die entweder Nullwerte oder eine leere Zeichenfolge haben. Vielen Dank.


5
In SQL gibt es ein OR-Schlüsselwort.
Robert Harvey

13
Diese Frage zeigt keinen Forschungsaufwand. Es ist wichtig, dass Sie Ihre Hausaufgaben machen . Sagen Sie uns, was Sie gefunden haben und warum es Ihren Anforderungen nicht entspricht. Dies zeigt, dass Sie sich die Zeit genommen haben, um sich selbst zu helfen. Es erspart uns, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu erhalten. FAQ .
Kermit

1
Mögliches Duplikat von Wie man Daten aus einer MySQL-Tabelle auswählt, in der eine Spalte NULL ist (dies war eine MySQL-Frage, aber es ist im Grunde die gleiche Antwort für t-sql)
Michael Berkowski

Antworten:



27

Sie können dies einfach tun:

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

25

Wenn Sie es im SELECT- Bereich benötigen, können Sie es wie folgt verwenden.

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

Sie können das nulldurch Ihren Ersetzungswert ersetzen .


1
Die NVL von Oracle (var1, 'value') sorgt für das Ersetzen der leeren Zeichenfolge. Isnull von T-SQL (var1, 'value') tut dies nicht.
Jenna Leaf

15
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''

2
SELECT * FROM TableName WHERE columnNAme ist NULL ODER RTRIM (columnName) = ''
Xavier John

2
Wie Xavier betont, besteht keine Notwendigkeit, BEIDE zu tun, ltrimund rtrimwenn das Ziel lediglich darin besteht, mit einer leeren Zeichenfolge zu vergleichen. GRUND: Wenn es NUR Leerzeichen gibt, wird durch einen einzigen Schnitt alles entfernt. Zum Beispiel ist es Ihnen egal, ob der Vergleich fehlschlägt, weil "abc" oder "abc" übrig bleibt.
ToolmakerSteve

8

So finden Sie Zeilen, in denen sich col befindet NULL, leere Zeichenfolge oder Leerzeichen (Leerzeichen, Tabulatoren):

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

So finden Sie Zeilen, in denen sich col befindet NOT NULL, leere Zeichenfolge oder Leerzeichen (Leerzeichen, Tabulatoren):

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

7

Einige sargable Methoden ...

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);

Und einige nicht sargable ...

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

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

SELECT *
FROM #T
WHERE ISNULL(SomeCol,'') = '';

3

Das ist hässliches MSSQL:

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

3

meine beste Lösung:

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

COALESCE gibt den ersten Nicht-Null-Ausdruck in der Ausdrucksliste () zurück.

Wenn der fieldValue null oder eine leere Zeichenfolge ist, dann: Wir geben das zweite Element zurück, dann 0.

Wenn also 0 gleich 0 ist, ist dieser Feldwert eine Null oder eine leere Zeichenfolge.

in Python zum Beispiel:

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

Viel Glück


2

Sie überprüfen null mit IS NULL und Zeichenfolge leer mit LEN (RTRIM (LTRIM (Spalte))) = 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

Sie können die isnullFunktion verwenden, um sowohl nullleere als auch leere Werte eines Textfelds abzurufen:

SELECT * FROM myTable
WHERE isnull(my_nullable_text_field,'') = ''

Die isnull-Funktion prüft buchstäblich nur, ob der Wert null ist. Es funktioniert nicht, wenn die Zeichenfolge leer ist ("").
Max Pringle

@ Max Pringle. Ich sage nicht anders. Auch der angegebene Code adressiert die Fragenanfrage. Ich bin mir nicht sicher über deinen Beitrag. Schlagen Sie eine Bearbeitung vor, anstatt eine Abstimmung vorzunehmen.
Alberto De Caro

wird Ihren Rat annehmen. Ich habe jetzt einen Änderungsvorschlag eingereicht. Diese where-Klausel ruft nur die Nullwerte ab, nicht die leeren Zeichenfolgenwerte. Ein nullif könnte verwendet werden, um die leeren Werte zu erhalten.
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

Sie können dies überprüfen '', NULLindem Sie es in NULLusing konvertierenNULLIF

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

oder Sie können NULLals ''mit prüfenSELECT 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

In sproc können Sie die folgende Bedingung verwenden:

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

1

durch diese Funktion:

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

und benutze dies:

dbo.isnull (Wert, 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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.