2016-10-20 15 views
1

私のケースで何が間違っているのか教えてくれますか? :)SQL Server:where句でのケース

私は請求書と返済を選択しています。

エラー

メッセージ4145、レベル15、状態1、行10
条件は、近くに '終了' が期待されているコンテキストで指定された非ブール型の式。

コード:

select 
    I.subject1, R.subject2 
from 
    dbo.invoice I 
left join 
    dbo.repayments R on I.subject1 = R.subject2 
where 
    case 
     when R.subject2 is not null and R.remains_due > 0 
      then R.remains_due 
     when R.subject2 is not null and R.remains_due = 0 
      then I.remains_due 
     when R.subject2 is not null and R.due_date <= GETDATE() 
      then R.due_date 
     when R.subject2 is null and I.due_date <= GETDATE() 
      then I.due_date 
    end 
+0

一般に、WHERE句の 'case'式の代わりに' AND'/'OR'を使用することをお勧めします。 – jarlh

+2

あなたのcase式は値を返します。これを何かと比較する必要があります。 – jarlh

+0

"then"は私にとって重要なので、 "case"が必要です。 あなたが言ったことは比較ですか?それについてもっと教えていただけますか? – otesanek

答えて

0

WHERE clauseで検索条件を使用する方法を次のshow。

SELECT 
    ColumnB, 
    ColumnA 
FROM 
    TableA 
WHERE 
    ColumnA = CASE WHEN ColumnB IS NULL THEN 'Test AA' 
        WHEN ColumnB IS NOT NULL THEN 'Test BB' 
        ELSE 'Test CC' END 

質問が正しくありません。クエリは次のようになります。

SELECT 
    ColumnB, 
    ColumnA 
FROM 
    TableA 
WHERE 
    -- Where is ColumnA??? 
    -- Return types must be same type! 
    CASE WHEN ColumnB IS NULL THEN 'Test AA' -- VARCHAR? 
     WHEN ColumnB IS NOT NULL THEN 1 -- INT ? 
     ELSE '2016.10.20' END -- DATETIME? 

select 
    I.subject1, 
    R.subject2 
from 
    dbo.invoice I LEFT join 
    dbo.repayments R on I.subject1 = R.subject2 
WHERE 
    (
     R.subject2 is not NULL AND 
     R.remains_due >= 0 AND 
     R.due_date <= GETDATE() 
    ) OR 
    (
     R.subject2 is NULL AND 
     I.due_date <= GETDATE() AND 
     I.remains_due >= 0 
    ) 
+1

返信いただきありがとうございます! :) – otesanek

+0

カラムremain_dueはお金で、カラムの期日はdatetimeです。 たとえば、varcharに変換する必要がありますか? あなたの返信内容を完全に理解しているかどうかはわかりません。 – otesanek

+0

どのinvocesを選択したいですか? – NEER

0

を更新しました、私はあなたがWHERE句の総誤解を持っていると思う

select 
    I.subject1, R.subject2 
from 
    dbo.invoice I 
left join 
    dbo.repayments R on I.subject1 = R.subject2 
where 

     R.subject2 is not null and R.remains_due > 0 
      AND 
     R.subject2 is not null and R.remains_due = 0 
      AND 
     R.subject2 is not null and R.due_date <= GETDATE() 
      AND 
     R.subject2 is null and I.due_date <= GETDATE() ; 
+0

ありがとうございますが、状態に論理がありません:/ – otesanek

0

を試してみてください。 where句は、結果セットに含めるレコードの条件です。例:請求書がある日付範囲以上のすべてのレコード、または金額=あなたが探している価値のある請求書。論理的なTRUEまたはFALSEのみを返す必要があります。

case文を使用すると、条件に基づいてどのVALUEを返すかを識別することができます。この場合、行の特定の条件の下で、特定のものがユーザーに表示されるように戻す必要があります。

select 
     I.subject1, 
     R.subject2, 
     case when R.subject2 is not null and R.remains_due > 0 
       then R.remains_due 
      when R.subject2 is not null and R.remains_due = 0 
       then I.remains_due 
      end as AmountDue, 
     case when R.subject2 is not null and R.due_date <= GETDATE() 
       then R.due_date 
      when R.subject2 is null and I.due_date <= GETDATE() 
       then I.due_date 
      end DueDate 
    from 
     dbo.invoice I 
     left join dbo.repayments R 
      on I.subject1 = R.subject2 
0

基本的にCASE式を使用することである - 今、あなたはほとんどのWHERE句で正しいでした単一値に

を返す式の結果に基づいて、いくつかの式を評価します。 Case Expressionはいくつかの値を返しますが、WHERE句では他の値と比較する必要があります。これはクエリの一部ではありません。正しい結果を得るためにもこの方法を試すことができます。

... 
where 
1 = case 
     when R.subject2 is not null and R.remains_due > 0 
     then 1 
     when R.subject2 is not null and R.remains_due = 0 
     then 1 
     when R.subject2 is not null and R.due_date <= GETDATE() 
     then 1 
     when R.subject2 is null and I.due_date <= GETDATE() 
     then 1 
    end 
+0

ありがとう、1 =大変です。しかしあなたのコードは私に0.5mのレコードを与えました:X – otesanek