你能告诉我在我的案子中我做错了什么吗? :)
我正在选择发票和还款。
错误:
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}}";
答案 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