The following code is intended to update an emp record. However, if Zip is null, the data does not get updated.
I did not write this code, and I am not sure of the original intention behind using this type of syntax and I don't see a benefit to it.
Example: zip = iif(zip<>@zip,@zip,zip)
I would just write this: zip = @zip
Am I missing anything?
The intention is to update the zip field as long as the @zip parameter is not null. The problem is that it does not get updated with the zip field currently is null.
UPDATE emp
SET first_name = iif(first_name <> @first_name,@first_name,first_name)
,last_name = iif(last_name <> @last_name, @last_name, last_name)
,dob = iif(dob <> @dob,@dob,dob)
,social_security_num = iif(social_security_num<>@social_security_num,@social_security_num,social_security_num)
,dl_num = iif(dl_num<>@dl_num,@dl_num,dl_num)
,dl_state = iif(dl_state<>@dl_state,@dl_state,dl_state)
,gender = iif(gender<>@gender,@gender,gender)
,address1 = iif(address1<>@address1,@address1,address1)
,address2 = iif(address2<>@address2,@address2,address2)
,city = iif(city<>@city,@city,city)
,zip = iif(zip<>@zip,@zip,zip)
,STATE = iif(state<>@state,@state,state)
,primary_phone = iif(primary_phone<>@primary_phone,@primary_phone,primary_phone)
,emergency_contact = iif(emergency_contact<>@emergency_contact,@emergency_contact,emergency_contact)
,secondary_phone = iif(secondary_phone<>@secondary_phone,@secondary_phone,secondary_phone)
,emergency_contact_phone = iif(emergency_contact_phone<>@emergency_contact_phone,@emergency_contact_phone,emergency_contact_phone)
,emp_pay_type_id = @emp_pay_type_id
WHERE emp_id = @emp_id
CodePudding user response:
There is a difference: The column will never be updated to null.
Any comparison with null is not true (except for the special IS NULL expression), even if compared to another null.
The expression
iif(zip<>@zip,@zip,zip)
has the same effect as
case when @zip is null or zip is null then zip else @zip end
Note also that if the column is itself null, it will also never be updated.
CodePudding user response:
This is basically stating: If the zip column does not equal zip, then the new value should be @zip (the variable) otherwise the new value should be the existing value.
Your method is not making a comparison and just setting it to the variable.
Both should output the same result, unless the variable is null. This will cause a short circuit and the IF will be FALSE, and the current value will be retained.
DECLARE @table TABLE (zip NVARCHAR(10))
INSERT INTO @table (zip) VALUES ('90210-1234')
DECLARE @zip NVARCHAR(10)
SELECT *
FROM @table
UPDATE @table
SET zip = IIF(@zip<>zip,@zip,zip)
SELECT *
FROM @table
UPDATE @table
SET zip = @zip
SELECT *
FROM @table
SET @zip = '90210-1234'
UPDATE @table
SET zip = @zip
SELECT *
FROM @table
zip
---
90210-1234 --Original Value
zip
---
90210-1234 --Not updated because of short circuit
zip
---
NULL --Set to NULL as the variable was NULL
zip
---
90210-1234 --Set to a value
