SQL Server:在where子句中的情况

时间:2016-10-20 08:10:15

标签: sql sql-server tsql

你能告诉我在我的案子中我做错了什么吗? :)

我正在选择发票和还款。

错误

  

Msg 4145,Level 15,State 1,Line 10
  在预期条件的上下文中指定的非布尔类型的表达式,接近' end'。

代码:

string jsonstring1 = @"{'data':'N'}";
string jsonstring2 = @"{'data':[{'name':'jack','address':'la'}]}";
string jsonstring3 = @"{'data':{'flag':true}}";

4 个答案:

答案 0 :(得分:1)

以下说明如何在WHERE clause

中使用搜索条件
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 :(得分:1)

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() ;

答案 2 :(得分:1)

我认为你对WHERE子句有一个完全的误解。 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

答案 3 :(得分:1)

CASE EXPRESSION的基本用法是 - 根据表达式的结果评估一些表达式返回单值

现在你几乎在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