Данные не приходят, когда старое значение изменяется с нуля на другое значение - PullRequest
0 голосов
/ 06 ноября 2019

Оператор выбора не отображает данные, когда я изменяю значение с 0 на ноль или наоборот. Но когда я меняю данные с 0 на 1, оператор выбора начинает отображать данные.

Пожалуйста, найдите мой код (запрос)

declare @tmptable TABLE (Id INT, IsVal BIT)
INSERT Into @tmptable VALUES(1,0)
--SELECT * FROM @tmptable
DECLARE @Id INT
DECLARE @IsVal BIT

SET @Id=1
SET @IsVal=NULL

select @Id as PrimaryKeyValue
,CAST(IsVal as VARCHAR) as OldValue,CAST(ISNULL(@IsVal,'') as VARCHAR) as NewValue
,'IsVal' AS DisplayFieldName,
CASE IsVal 
     WHEN 1 THEN 'Yes' 
     WHEN 0 THEN 'No'
     END  as DisplayOldValue
,CASE  @IsVal 
      WHEN 1 THEN 'Yes'
      WHEN 0 THEN 'No'
     END  as DisplayNewValue   
from @tmptable WHERE Id =@Id and ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

Возникла проблема с оператором: -

ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

Не могу понять, какое изменение мне нужно внести в приведенное выше утверждение, чтобы мой запрос мог работать так, как я хотел. Пожалуйста, помогите.

@ Переменная IsVal используется для установки значения.

Спасибо

Ответы [ 4 ]

1 голос
/ 06 ноября 2019

Вы правы, проблема в следующем выражении: ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

Когда IsVal равен 0, а @IsVal равен NULL, это становится:

0 <> ''

, которое будет сравниваться как целые числа,так что '' становится 0, и вы получаете:

 0 <> 0

Итак, в вашем случае 0, '' и NULL будут рассматриваться как равные. Вам нужно выбрать недопустимый int (может быть -1?) Или привести 0 к varchar, чтобы сделать это сравнение.

0 голосов
/ 06 ноября 2019

Почему бы просто не использовать простое сравнение?

(IsVal = @IsVal or IsVal IS NULL AND @IsVal IS NULL)

У вас все еще могут быть проблемы с преобразованием типов, если предположить, что типы несовместимы.

Если это так:

(IsVal = CONVERT(VARCHAR(255), @IsVal) or
 IsVal IS NULL AND @IsVal IS NULL
)

Нет необходимости придумывать специальные значения для isnull() или coalesce().

0 голосов
/ 06 ноября 2019

Почему бы просто не использовать простое сравнение?

(IsVal = @IsVal or IsVal IS NULL AND @IsVal IS NULL)

У вас все еще могут быть проблемы с преобразованием типов, если предположить, что типы несовместимы.

0 голосов
/ 06 ноября 2019

Спасибо за помощь, мне удалось решить проблему: -

declare @tmptable TABLE (Id INT, IsVal BIT)
INSERT Into @tmptable VALUES(1,0)
--SELECT * FROM @tmptable
DECLARE @Id INT
DECLARE @IsVal BIT
declare @oldval VARCHAR(10)
SET @Id=1
SET @IsVal=null

select @oldval=isval from @tmptable WHERE Id=1
print ISNULL(@oldval,'')
print ISNULL(@IsVal,'')
--if(ISNULL(CAST(@oldval AS INT),'')<>ISNULL(CAST(@IsVal AS INT),''))
--BEGIN
PRINT '1'
select @Id as PrimaryKeyValue
,CAST(IsVal as VARCHAR(10)) as OldValue,CAST(ISNULL(@IsVal,'') as VARCHAR(10)) as NewValue
,'IsVal' AS DisplayFieldName,
CASE IsVal 
     WHEN 1 THEN 'Yes' 
     WHEN 0 THEN 'No'
     END  as DisplayOldValue
,CASE  @IsVal 
      WHEN 1 THEN 'Yes'
      WHEN 0 THEN 'No'
     END  as DisplayNewValue   
from @tmptable WHERE Id =@Id and ISNULL(CAST(IsVal AS VARCHAR),'null')<>ISNULL(CAST(@IsVal AS VARCHAR),'null')
...