我有一个简单的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
答案 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
子句)可以评估true
,false
和unknown
,因为SQL会让人感到困惑(和不一致的应用)三值逻辑。因此,如果TETmeetingID
或@SomeParameter
可以为null,那么您可能需要添加一些代码来处理此问题。