SQL:当找不到记录时,如何返回所有空值?

SQL:当找不到记录时,如何返回所有空值?,sql,sql-server,null,Sql,Sql Server,Null,我有一个简单的选择 SELECT TETmeetingID, DateID, WeekNo, TETID, TradeStaffID, EngStaffID, MathsStaffID, IoTStaffID, Others, TradeStaffPresent, EngStaffPresent, MathsStaffP

我有一个简单的选择

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
时有效

但如果没有,我希望至少看到一条记录的每一列中都有空值

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

谢谢

更新

我试过使用TIES
,但也没有返回一条记录。也许我做错了。我还尝试了
unionnull、NULL、
etc技巧,但是当列的数量可能是未定义的“n”时,这就很麻烦了。我可以正确执行此操作的唯一方法是使用
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
这应该可以

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

如果谓词为true,则始终会有2行或更多行。这样您就可以检查@@ROWCOUNT了。1表示没有命中,较大表示命中

最后,我不想再次键入所有26列,因此我删除了
ConditionTrue
列,并使用
SELECT*
作为快捷方式。如果您不介意使用flag列,请保留它,或者您可以将
ALTER
语句移动到
If
块之前,并以不同方式过滤掉,例如
TETmeetingID不为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;
这应该可以

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

如果谓词为true,则始终会有2行或更多行。这样您就可以检查@@ROWCOUNT了。1表示没有命中,较大表示命中

最后,我不想再次键入所有26列,因此我删除了
ConditionTrue
列,并使用
SELECT*
作为快捷方式。如果您不介意使用flag列,请保留它,或者您可以将
ALTER
语句移动到
If
块之前,并以不同方式过滤掉,例如
TETmeetingID不为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;

这正是您想要的:

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

这正是您想要的:

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

请记住,
UNION
是逻辑
的对应项:

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
选择TETmeetingID
来自tblTETMeeting
其中TETmeetingID=@SomeParameter
联合
选择NULL作为TETmeetingID——不要让我把它们全部写出来!
来自tblTETMeeting
其中TETmeetingID@SomeParameter

说到逻辑,请记住,在SQL中,搜索条件(
WHERE
子句)可以计算
true
false
unknown
,因为SQL的三值逻辑令人困惑(且应用不一致)。因此,如果
TETmeetingID
@SomeParameter
可以为空,那么您可能需要添加一些代码来处理此问题。

记住
UNION
是logical
的对应项:

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
选择TETmeetingID
来自tblTETMeeting
其中TETmeetingID=@SomeParameter
联合
选择NULL作为TETmeetingID——不要让我把它们全部写出来!
来自tblTETMeeting
其中TETmeetingID@SomeParameter

说到逻辑,请记住,在SQL中,搜索条件(
WHERE
子句)可以计算
true
false
unknown
,因为SQL的三值逻辑令人困惑(且应用不一致)。因此,如果
TETmeetingID
@SomeParameter
可以为空,那么您可能需要添加一些代码来处理此问题。

这类事情最好在应用程序层处理,而不是在查询中处理。除了我认为不应该在SQL中完成这一点之外,最简单的方法(IMO)是使用if/ELSE语句。e、 g.
如果存在(从tblTETMeeting中选择1,其中TETmeetingID=@SomeParameter),则myQuery否则选择NULL,NULL…
。或者,如果只需要一行,@whizzle链接中的答案就可以使用。实际上,@whizzle链接中接受的答案只有在返回单个字段时才有用,但这里不是这样。@sstan whizzle链接的最后一部分可以调整为适用于任意数量的列。e、 g.
select top 1*from(myquery union all select null,null,null…)t按大小写顺序当TETmeetingID为null时,则1 ELSE 0 END
但它不会直接回答这里的问题。这种事情最好在应用程序层处理,而不是在查询中处理。除了我认为不应该在SQL中执行之外,最简单的方法(IMO)是使用IF/ELSE语句。e、 g.
如果存在(从tblTETMeeting中选择1,其中TETmeetingID=@SomeParameter),则myQuery否则选择NULL,NULL…
。或者,如果只需要一行,whizzle链接中的答案就可以使用。实际上,@whizzle链接中被接受的答案只有在您需要时才有用