使用IFF()函数时,如果数据为null,我将收到不匹配的信息

时间:2019-02-03 18:05:36

标签: sql sql-server sql-server-2012

当使用IFF()函数在源和目标两个表之间比较数据时,如果列具有IS NUll值,我将收到“不匹配”。请您给我提建议?

"browserslist": [
    "last 1 version",
    "> 1%",
    "maintained node versions",
    "not dead"
]

如果列中的数据匹配,无论是空字符串还是IS NULL值,都应该给我“匹配”结果,如果数据不匹配,我应该收到“不匹配”

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议您使用case而不是iif()case表达式是标准SQL。 iif()用于与MS Access进行“向后”兼容性。

第二,您需要明确说明SQL Server中的NULL比较。它不支持NULL安全比较。看起来像:

(CASE WHEN T1.MBR_STAT = CAST(T2.MEMSTA_SHORT_NAME AS VARCHAR(10))
      THEN 'MATCH'
      WHEN T1.MBR_STAT IS NULL AND T2.MEMSTA_SHORT_NAME IS NULL
      THEN 'MATCH'
      ELSE 'DON''T MATCH'
 END) AS MBR_STAT_VALIDATION,

我还感到奇怪的是,当您使用CAST()来实现此目的时,它具有一个非常好的函数LEFT(),它更简单并且使逻辑更清晰:

(CASE WHEN T1.MBR_STAT = LEFT(T2.MEMSTA_SHORT_NAME, 10)
      THEN 'MATCH'
      WHEN T1.MBR_STAT IS NULL AND T2.MEMSTA_SHORT_NAME IS NULL
      THEN 'MATCH'
      ELSE 'DON''T MATCH'
 END) AS MBR_STAT_VALIDATION,

答案 1 :(得分:0)

使用coalesce进行null检查,并将null替换为永远不会与比较列值匹配的值

 IF(coalesce(T1.MBR_STAT,'something_')  = CAST(T2.MEMSTA_SHORT_NAME AS VARCHAR(10)),'MATCH', 'DON''T MATCH')    AS MBR_STAT_VALIDATION