Есть ли какой-либо способ вернуть значение null в JSON_VALUE вместо пустого в SQL Server

#sql-server #stored-procedures #sql-function

Вопрос:

Мой пример кода выглядит так:

 DECLARE @JsonText varchar(MAX) = '{  "Test": "" }'  DECLARE @Name varchar(MAX) = JSON_VALUE(@JsonText, '$.Test') ;  IF (@Name IS NULL) BEGIN  SELECT 'Null' AS Result END ELSE BEGIN   SELECT 'Empty' AS Result END  

и у меня есть выход:

 Result ---------- Empty  

Мой ожидаемый результат равен нулю, я попробовал с помощью trim, а затем проверил, что строка пуста, а затем вернул значение null, работает нормально.

 IF (@Result = '')   SET @Result = NULL;   

Но я ищу любую другую альтернативу, если она доступна, которая возвращает значение null вместо пустого.

Комментарии:

1. Если вы хотите , чтобы значение было NULL , затем определите значение, как Null в вашем JSON. Null и "" не имеют одинаковой ценности, точно так же, как NULL и '' не являются.

2. Можете ли вы объяснить, почему вам нужен NULL? NULL означает неизвестное , но это не неизвестно — это и пустая строка.

Ответ №1:

Строка нулевой длины (в JSON "" и в T-SQL '' ) и NULL не имеют одного и того же значения. В вашем JSON у вас есть строка нулевой длины. Если вы хотите NULL , чтобы значение возвращалось из вашего JSON, определите значение, как Null в вашем JSON:

 DECLARE @JsonText nvarchar(MAX) = N'{  "Test": null }';  DECLARE @Name nvarchar(MAX) = JSON_VALUE(@JsonText, '$.Test'); IF (@Name IS NULL) BEGIN  SELECT 'Null' AS Result; END ELSE BEGIN   SELECT 'Empty' AS Result; END;  

Это возвращает varchar значение 'Null' .

В качестве альтернативы вы можете использовать NULLIF для возврата NULL , если ваше выражение возвращает строку нулевой длины, но я бы предположил, что на самом деле это JSON, который нуждается в исправлении:

 SET @Name = NULLIF(JSON_VALUE(@JsonText, '$.Test'),N'');