Jak używać NULL lub pustego ciągu w SQL


129

Chciałbym wiedzieć, jak używać NULL i pustego ciągu w tym samym czasie w WHEREklauzuli w SQL Server. Muszę znaleźć rekordy, które mają wartości null lub pusty ciąg. Dzięki.


5
W SQL jest słowo kluczowe OR.
Robert Harvey,

13
To pytanie nie wskazuje na żaden wysiłek badawczy. Ważne jest, aby odrobić lekcje . Powiedz nam, co znalazłeś i dlaczego nie spełniło Twoich potrzeb. To pokazuje, że poświęciłeś czas, aby spróbować sobie pomóc, oszczędza nam powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga uzyskać bardziej konkretną i trafną odpowiedź. FAQ .
Kermit

1
możliwy duplikat Jak wybrać dane z tabeli MySQL, w której kolumna ma wartość NULL (to było pytanie MySQL, ale w zasadzie jest to ta sama odpowiedź dla t-sql)
Michael Berkowski

Odpowiedzi:



27

Możesz to po prostu zrobić:

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

25

Jeśli potrzebujesz tego w sekcji SELECT, możesz użyć w ten sposób.

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

możesz zastąpić nullswoją wartością zastępczą.


1
NVL Oracle (var1, 'value') zajmie się zamianą pustego łańcucha ''. Isnull (var1, 'value') języka T-SQL nie.
Jenna Leaf

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

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

2
Jak podkreśla Xavier, nie ma potrzeby robić RAZEM ltrimi rtrimjeśli celem jest jedynie porównanie z pustym ciągiem. POWÓD: jeśli jest TYLKO białe spacje, pojedyncze przycięcie usunie je wszystkie. Na przykład nie obchodzi Cię, czy porównanie się nie powiedzie, ponieważ pozostaje „abc” lub „abc”.
ToolmakerSteve

8

Aby znaleźć wiersze, w których jest col NULL, pusty ciąg lub spacje (spacje, tabulatory):

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

Aby znaleźć wiersze, w których jest col NOT NULL, pusty ciąg lub spacje (spacje, tabulatory):

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

7

Niektóre metody do rozstrzygnięcia ...

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

I kilka niepodważalnych ...

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

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

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

3

To jest brzydki MSSQL:

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

3

moje najlepsze rozwiązanie:

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

COALESCE zwraca pierwsze niezerowe wyrażenie z listy wyrażeń ().

jeśli wartość fieldValue ma wartość null lub pusty ciąg, to: zwrócimy drugi element, a następnie 0.

więc 0 jest równe 0, to fieldValue jest ciągiem pustym lub pustym.

w Pythonie na przykład:

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

powodzenia


2

youe check null With IS NULL and string Empty With 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

Możesz użyć isnullfunkcji, aby pobrać zarówno nulli puste wartości pola tekstowego:

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

Funkcja isnull dosłownie sprawdza, czy wartość jest null. Nie zadziała, jeśli ciąg jest pusty („”).
Max Pringle,

@Max Pringle. Nie stwierdzam inaczej. Również podany kod odpowiada na zapytanie. Nie jestem pewien co do twojego wkładu. Zaproponuj zmianę zamiast głosowania w dół.
Alberto De Caro,

posłucha twojej rady. Wprowadziłem teraz sugerowaną zmianę. Ta klauzula gdzie pobiera tylko wartości null, a nie puste wartości łańcuchowe. Aby uzyskać puste wartości, można użyć nullif.
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

Możesz sprawdzić ''jak NULL, konwertując go na NULLusingNULLIF

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

lub możesz sprawdzić, NULLjak ''używaszSELECT 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

W sproc możesz użyć następującego warunku:

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

1

za pomocą tej funkcji:

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

i użyj tego:

dbo.isnull (wartość, 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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.