2013-03-27 2 views
66

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

+5

Там есть ключевое слово OR в SQL. –

+9

Этот вопрос не показывает никаких исследований. Очень важно сделать домашнее задание **. Расскажите нам, что вы нашли, и *** почему *** это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ. [FAQ] (http://stackoverflow.com/questions/how-to-ask). – Kermit

+1

Возможный дубликат [Как выбрать данные из таблицы MySQL, где столбец равен NULL] (http://stackoverflow.com/questions/14279947/how-to-select-data-from-mysql-table-where-a-column -is-null) (это был вопрос MySQL, но это в основном тот же ответ для t-sql) –

ответ

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

Или

Select * 
From Table 
Where IsNull(col, '') = '' 
+7

в соответствии с ответом @Bradc в этом http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable?lq=1, лучше использовать первый подход. –

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

Спасибо J W Мне удалось заставить его сработать. – poshan

+1

SELECT * FROM TableName WHERE columnNAme IS NULL ИЛИ RTRIM (columnName) = '' –

+0

Как указывает Ксавье, нет необходимости делать BOTH 'ltrim' и' rtrim', если целью является просто сравнение с пустой строкой. ПРИЧИНА: если есть ТОЛЬКО пробелы, одна отделка удалит все из них. Например, вам все равно, не сравнится ли сравнение, потому что остается «abc» или «abc». – ToolmakerSteve

18

Вы можете просто сделать это:

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

Я ценю ваше предложение, спасибо FaceOfJock – poshan

0

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

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

Функция isnull буквально просто проверяет, имеет ли значение значение null. Он не будет работать, если строка пуста (""). –

+0

@Max Pringle. Я не утверждаю иначе. Также предоставленный код адресует запрос. Не уверен в вашем вкладе. Предложите редактировать вместо downvoting. –

+0

возьмет ваш совет. Теперь я ввел предлагаемое редактирование. Это предложение where получает только нулевые значения, а не пустые значения строки. Для получения пустых значений можно использовать nullif. –

0
--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

Это некрасиво MSSQL:

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

Чтобы найти строки, где столбец является NULL, пустая строка или пробелы (пробелы, вкладки):

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

Чтобы найти строки, где столбец является NOT NULL, пустая строка или пробелы (пробелы, вкладки):

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

Некоторые sargable методы ...

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

А некоторые не sargable те ...

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

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

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

В запросе выбора кто-то может использовать, как это.

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

вы можете заменить null со своим значением замещения.

0

мое лучшее решение:

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

COALESCE возвращает первый ненулевой выраж в списке выражений().

если fieldValue является пустой или пустой строкой, то: мы вернем второй элемент, затем 0.

поэтому 0 равно 0, то это полеValue является пустой или пустой строкой.

в питоне для Exemple:

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

удачи

+0

Я сделал это. благодаря –

0

В sproc, вы можете использовать следующее условие:

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

этой функцией:

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)

0
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()