sql - 在 T-SQL 存储过程的参数中将 NULL 作为值传递
问题描述
我有这个存储过程,我将一个可能为 NULL 的日期参数传递给它。我试图理解的逻辑是,当 Date 参数为 NULL 时,应选择日期列的最大值,但当参数不为 NULL 时,应将参数作为值传递。
CREATE PROCEDURE [rdm].[Param_Load_Test2]
@Retro_Date DATE
AS
BEGIN
SELECT
CASE
WHEN @Retro_Date IS NULL
THEN MAX(lnd.FILE_DATE)
ELSE @Retro_Date
END AS TEST_DATE
INTO
#LoadTest1234
FROM
TWV.TABLE_WITH_VALUES AS lnd
GROUP BY
FILE_DATE;
SELECT TEST_DATE
FROM #LoadTest1234
END
GO
现在,当我使用 EXEC 语句针对 NULL 情况测试上述代码时,我得到了错误的值。Not NULL 案例工作正常。
EXEC rdm.Param_Load_Test2 NULL
>> 2018-03-31
>> 2018-05-31
我只期望一个值 2018-05-31 但它返回 2 条记录。我究竟做错了什么 ?
解决方案
你有多余的GROUP BY
。我想你想要:
SELECT MAX(CASE WHEN @Retro_Date IS NULL THEN lnd.FILE_DATE ELSE @Retro_Date END) AS TEST_DATE
INTO #LoadTest1234
FROM TWV.TABLE_WITH_VALUES as lnd;
或者更简单地说:
SELECT COALESCE(@Retro_Date, MAX(lnd.FILE_DATE)) AS TEST_DATE
INTO #LoadTest1234
FROM TWV.TABLE_WITH_VALUES as lnd;
我不确定您为什么要为此使用临时表。但我猜这是更复杂逻辑的一部分。
推荐阅读
- cordova - 使用 Cordova 检测设备是否可以访问华为应用程序库
- python - 当写“\n”时,为什么要替换两个字符?
- c++ - C++ 中 char 数组的初始化是如何工作的?
- java - 如何从表中选择行?
- visual-studio - DocFX 为不同文件夹中的项目生成文档
- python - 将相同的字符串附加到 pandas 列中的字符串列表
- python - V-rep IndexError
- javascript - 在 Quill 编辑器 Angular 2+ 中添加字体
- javascript - 如何在 C# 中执行松散相等运算符?
- c# - 使用 CoreWebView2NewWindowRequestedEventArgs 在子窗口中打开 URL