SQL:如何找不到记录时返回所有NULL?

时间:2016-08-25 00:44:28

标签: sql sql-server null

我有一个简单的SELECT ...

SELECT  TETmeetingID,
        DateID,
        WeekNo,
        TETID,
        TradeStaffID,
        EngStaffID,
        MathsStaffID,
        IoTStaffID,
        Others,
        TradeStaffPresent,
        EngStaffPresent,
        MathsStaffPresent,
        IoTStaffPresent,
        CurricTrade,
        CurricEnglish,
        CurricMaths,
        CurricIoT,
        CurricAlign,
        Notes,
        WeeksToGo,
        TotalWeeks,
        CreatedDate,
        CreatedBy,
        Complete,
        CompletedDate,
        CompletedBy
FROM tblTETMeeting
WHERE TETmeetingID = @SomeParameter

WHERE子句返回true时,当然有效。

但如果没有,我想至少在每一列中看到一条带有NULL的记录。

我该怎么办?我选择上面的示例来显示我可能使用的列数,因此如果有一个更通用的查询可以“确定”列而不必将它们硬编码到答案中,那么这将是首选。 / p>

由于

更新

我已经尝试了WITH TIES,但这也没有返回单个记录。也许我做错了。我也尝试了UNION NULL, NULL,等技巧,但是当列数可能未定义为'n'时,这很麻烦。我能够正确执行此操作的唯一方法,但仍然需要提供正确数量的NULL,并使用CTE类型查询。

WITH CTE (    SELECT  TETmeetingID,
            DateID,
            WeekNo,
            TETID,
            TradeStaffID,
            EngStaffID,
            MathsStaffID,
            IoTStaffID,
            Others,
            TradeStaffPresent,
            EngStaffPresent,
            MathsStaffPresent,
            IoTStaffPresent,
            CurricTrade,
            CurricEnglish,
            CurricMaths,
            CurricIoT,
            CurricAlign,
            Notes,
            WeeksToGo,
            TotalWeeks,
            CreatedDate,
            CreatedBy,
            Complete,
            CompletedDate,
            CompletedBy
    FROM tblTETMeeting
    WHERE TETmeetingID = @SomeParameter) AS tbl1

select * from CTE WHERE cte.TETmeetingID IS NOT NULL UNION SELECT NULL,NULL,NULL, etc

3 个答案:

答案 0 :(得分:2)

这样做你想要的:

SELECT C.*
FROM
(SELECT 1 As DummyColumn) As DummyTable
LEFT OUTER JOIN 
tblTETMeeting C
ON TETmeetingID = @SomeParameter

答案 1 :(得分:1)

这应该做。

这个想法是在除了标志列之外的所有列中添加一个标志列和一个带有NULL的额外行。在此示例中,ConditionTrue是标志列。 1为真,0为假。这意味着如果WHERE中的谓词为真,则结果将是返回的所有行,其中ConditionTrue为1 加上一行空值为ConditioinTrue的0.另一方面,如果没有返回任何内容,它将只是ConditionTrue为0的null行。通过将结果放入临时表,您可以过滤掉不需要的行和列。

如果谓词为真,那么总会有2行或更多行。因此,您可以查看@@ ROWCOUNT以获得优势。 1表示没有命中,更大意味着命中。

最后,我不想再次输入所有26列,因此我删除了ConditionTrue列并使用SELECT *作为快捷方式。如果您不介意标记列,请将其保留,或者您可以在ALTER块之前移动IF语句,并以不同方式过滤,例如TETmeetingID IS NOT NULL

IF OBJECT_ID('Tempdb..#tblTETMeeting','U') IS NOT NULL
    DROP TABLE Tempdb..#tblTETMeeting;

DECLARE @COUNTS INT;

SELECT  TETmeetingID,
        DateID,
        WeekNo,
        TETID,
        TradeStaffID,
        EngStaffID,
        MathsStaffID,
        IoTStaffID,
        Others,
        TradeStaffPresent,
        EngStaffPresent,
        MathsStaffPresent,
        IoTStaffPresent,
        CurricTrade,
        CurricEnglish,
        CurricMaths,
        CurricIoT,
        CurricAlign,
        Notes,
        WeeksToGo,
        TotalWeeks,
        CreatedDate,
        CreatedBy,
        Complete,
        CompletedDate,
        CompletedBy,
        1 AS ConditionTrue
INTO #tblTETMeeting
FROM tblTETMeeting
WHERE TETmeetingID = @SomeParameter
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL,NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL,NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL,NULL,NULL, 0;

SET @COUNTS = @@ROWCOUNT; 

IF @COUNTS > 1 

    SELECT * FROM #tblTETMeeting WHERE ConditionTrue = 1;
ELSE
    BEGIN
        ALTER TABLE #tblTETMeeting 
            DROP COLUMN ConditionTrue;
        SELECT * FROM #tblTETMeeting;
    END;

答案 2 :(得分:0)

请记住UNION是逻辑OR的对应物:

SELECT TETmeetingID
  FROM tblTETMeeting
 WHERE TETmeetingID = @SomeParameter
UNION
SELECT NULL AS TETmeetingID  -- don't make me write them all out!
  FROM tblTETMeeting
 WHERE TETmeetingID <> @SomeParameter

说到逻辑,请记住在SQL中搜索条件(WHERE子句)可以评估truefalseunknown,因为SQL会让人感到困惑(和不一致的应用)三值逻辑。因此,如果TETmeetingID@SomeParameter可以为null,那么您可能需要添加一些代码来处理此问题。