查询返回空记录

时间:2021-03-17 16:46:11

标签: sql sql-server

我正在尝试从需要满足以下要求的表中选择 3 列(在 UPDATE 部分)

        SELECT A.ACTIVITY_CD, A.REASON_CD, A.REASON_DESC
    INTO #TmpViewResult
    FROM CFG_REASON A, #TmpViewParam B
    WHERE A.ACTIVITY_CD = CASE WHEN B.ActivityCd = '' THEN A.ACTIVITY_CD ELSE B.ActivityCd END
    AND A.REASON_CD = CASE WHEN B.ReasonCd = '' THEN A.REASON_CD ELSE B.ReasonCd END

它正在为我返回空记录。我在这里做错了什么,我应该如何改变它?

更新:

下面的答案对我不起作用。它仍然给我空记录。我在上面的查询之前有这个代码。

SELECT ActivityCd, ReasonCd
    INTO #TmpViewParam
    FROM OPENJSON(@Param)
    WITH (ActivityCd NVARCHAR(10),
    ReasonCd NVARCHAR(10))

下面是传递的参数,两个参数都可以为空或包含值。

@Param = N'{"ACTIVITY_CD": "RS00001", "REASON_CD": ""}'

Requirements

活动CD

  • 空白 = 所有活动
  • 值 = 特定活动代码

原因CD

  • 空白 = 上述所选活动的所有原因 cd
  • 值 = 所选活动代码的具体原因。

上面@Param 的预期结果: {"ACTIVITY_CD": "RS00001", "REASON_CD": "xxx", "REASON_DESC": "xxx"} 其余的记录根据参数

1 个答案:

答案 0 :(得分:0)

认为你想要:

SELECT r.ACTIVITY_CD, r.REASON_CD, r.REASON_DESC
INTO #TmpViewResult
FROM CFG_REASON r CROSS JOIN
     #TmpViewParam p
WHERE (r.ACTIVITY_CD = p.ActivityCd OR p.ActivityCd = '') AND
      (r.REASON_CD = p.ActivityCd OR p.REASON_CD = '') ;

这使用参数表作为每列的过滤器,如果值存在的话。注意:NULL 通常用于表示“不使用参数”而不是 ''

相关问题