2016-08-25 38 views
0

WHERE句はtrueを返すとき、私はもちろん、簡単なSELECT ...SQL:レコードが見つからないときにすべてのNULLを返す方法

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 

作品を持っています。

しかし、そうでなければ、少なくともすべての列にNULLを持つレコードを1つ表示したいと思う。

どうすればいいですか?上記の例では、使用できる列の数を表示するように選択しました。したがって、列を「決定」し、答えにハードコードする必要のないより一般的な問合せがある場合は、それが優先されます。

おかげ

UPDATE

私はWITH TIESを試してみたが、それはまた、単一のレコードを返しませんでした。たぶん私はそれを間違っていた。私もUNION NULL, NULL,などのトリックを試してみましたが、列数が未定義の場合は乱雑です。私はこれを正しく行うことができる唯一の方法ですが、私はまだCTE型のクエリでNULLの正しい数を提供することを余儀なくされています。

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 
+1

http:// stackoverflow。com/questions/8098795/return-a-value-if-no-record-is-found – whizzle

+0

この種のことは、アプリケーション層ではなく、クエリで最もよく処理されます。 – sstan

+0

これはSQLで行うべきではないと考えている以外は、IM/ELSEステートメントを使用するのが最も簡単な方法です(IMO)。例えば'存在する場合(tblTETMeeting WHERE TETmeetingID = @SomeParameterから1を選択してください)次に、myQuery ELSE SELECT NULL、NULL ... 'を選択します。あるいは、行が1つだけ期待される場合は、whizzleのリンクの回答が機能します。 – ZLK

答えて

2

ロジックの

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節) SQLの混乱のためにtrue,falseおよびunknownを評価することができます一貫して適用される)3値論理。したがって、TETmeetingIDまたは@SomeParameterがnullの場合は、これを処理するコードを追加する必要があります。

+0

パーフェクト!はい、うまくいきました。しかし、どのように!どのように1つのSELECT 1がこれを行うのですか? – Fandango68

+1

'DummyTable'と呼ばれるテーブルは、1つのカラムを持つ1つのレコードです。だから、あなたは何があっても1つのレコードを持っています。次に、必要に応じてあなたの「本当の」レコードにそれを加えることができます。オプションで、「OUTER JOIN」を使用することを意味します。 1は何も意味しません。あなたは '(MyFavouriteBandとしてMyFavouriteStuffとして選択 'マストドン')を使用することができ、それでも動作します。しかし、警告: 'SELECT *'は多くの理由で悪い習慣です - それを使用する習慣に入らないでください。 –

1

これは行う必要があります。

考えられるのは、フラグ列と、フラグ列を除くすべての列にNULLを持つ余分な行を追加することです。この例では、ConditionTrueがフラグ列です。 1を真、0を偽とする。つまり、WHEREの述語がtrueの場合、結果はConditionTrueの1 のヌルの行で、ConditioinTrueの0が返されます。一方、何も返されなければ、それはちょうどConditionTrueが0のヌルの行。結果をテンポラリ・テーブルに入れることで、不要な行と列を除外できます。

述語がtrueの場合、常に2つ以上の行が存在します。 @@ ROWCOUNTを確認することができます。 1はヒットしない、大きいとはヒットしないことを意味します。

最後に、26個の列をすべてもう一度入力する必要がないため、ConditionTrue列を削除し、SELECT *をショートカットとして使用しました。フラグの列を気にしない場合は、IFブロックの前にALTERステートメントを移動し、別の方法でフィルタリングすることができます(TETmeetingID IS NOT NULLなど)。

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

その長い答えをありがとうございますが、私はそれがすべての1つのSQLコマンドでは、他の答えを好むでしょう。 – Fandango68

0

UNIONを覚えていますが、論理的ORのカウンターパートである:これは何をしたいん

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; 
関連する問題