Як використовувати NULL або порожню рядок у SQL


129

Мені хотілося б знати, як одночасно використовувати NULL та порожню рядок у WHEREпункті SQL Server. Мені потрібно знайти записи, які мають або нульові значення, або порожній рядок. Дякую.


5
У SQL є ключове слово АБО.
Роберт Харві

13
Це питання не показує жодних зусиль для дослідження. Важливо робити домашнє завдання . Розкажіть, що ви знайшли і чому це не відповідало вашим потребам. Це свідчить про те, що ви знайшли час, щоб спробувати допомогти собі, це позбавляє нас від повторення очевидних відповідей, а найбільше це допомагає вам отримати більш конкретну та релевантну відповідь. FAQ .
Керміт

1
можливий дублікат Як вибрати дані з таблиці MySQL, де стовпець NULL (це було питання MySQL, але це в основному однаковий відповідь для t-sql)
Michael Berkowski

Відповіді:




25

Якщо вам це потрібно в розділі SELECT, можна використовувати так.

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

ви можете замінити nullзначення заміщенням.


1
NVL Oracle (var1, 'value') подбає про заміну порожнього рядка ''. Isnull T-SQL (var1, 'value') не відповідає.
Jenna Leaf

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

2
ВИБІР * ВІД Табл. ІМИ, де ІМЕНА стовпця НУЛЬ АБО RTRIM (columnName) = ''
Xavier John

2
Як вказує Ксав'є, немає потреби робити БОТИ, ltrimі rtrimякщо мета лише порівняння з порожньою рядком. ПРИЧИНА: якщо є ТОЛЬКО пробіл, одна обробка видалить усе це. Наприклад, вам не байдуже, чи не відбувається порівняння, тому що залишається "abc" або "abc".
ToolmakerSteve

8

Щоб знайти рядки, де стоїть col NULL, порожній рядок або пробіл (пробіли, вкладки):

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

Щоб знайти рядки, де стоїть col NOT NULL, порожній рядок або пробіл (пробіли, вкладки):

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

7

Деякі забірні методи ...

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

І деякі нестандартні ...

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

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

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

3

Це некрасивий MSSQL:

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

3

моє найкраще рішення:

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

COALESCE повертає перший ненульовий expr у списку виразів ().

якщо fieldValue є нульовим або порожнім рядком, тоді: другий елемент повернемо тоді 0.

тому 0 дорівнює 0, тоді це полеValue - це нульовий або порожній рядок.

у python for example:

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

Щасти


2

ви перевіряєте null З IS NULL, а рядок Empty with LEN (RTRIM (LTRIM (Column))) = 0 in

SELECT *
FROM AppInfra.Person
WHERE   LEN(RTRIM(LTRIM(NationalCode))) = 0 OR  NationalCode IS NULL



1

Ви можете використовувати isnullфункцію для отримання обох nullі порожніх значень текстового поля:

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

Функція isnull буквально просто перевіряє, чи є значення нульовим. Він не буде працювати, якщо рядок порожній ("").
Макс Прінгл

@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

Ви можете перевірити ''як NULLперетворення його на NULLвикористанняNULLIF

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

або ви можете розглянути NULLяк ''користувачSELECT 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

за цією функцією:

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

і скористайтеся цим:

dbo.isnull (значення, 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.