请关注我,这很难解释,我不确定我是否使用了正确的术语。
我需要做一个相当复杂的选择。它实际上是一个select语句,它有条件地决定使用哪个字段来过滤select。如果某个日期字段不为空,我需要检查该字段中的值是否在某个范围内。否则,如果该日期字段为null,我需要检查同一个表上的另一个字段int字段是否在一定范围内:
伪代码:
If [Date] is not null
Get sum (table.value) for rows Date >= dateValue and Date < dateValue
Else
Get sum (table.value) for rows Int >= intValue and Int < intValue
我目前的尝试:
SELECT CASE WHEN a.Date IS NOT NULL THEN
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END))
ELSE
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END)
END AS 'A'
有什么想法吗?询问您是否需要更多信息。 提前致谢。
答案 0 :(得分:5)
一种方法是将2个单独的查询UNIONed放在一起,但只有一个子句会生成一个值。这避免了OR语句。
SELECT SUM(Value)
FROM MyTable
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always
UNION ALL
SELECT SUM(Value)
FROM MyTable
WHERE MyTable.Int >= intValue and Table.Int < intValue
AND --ignore this clause if date is NOT NULL
MyTable.Date IS NULL
编辑,使用OR:
SELECT SUM(Value)
FROM MyTable
WHERE
(
MyTable.Date IS NOT NULL AND
MyTable.Date >= dateValue and Table.Date < dateValue
)
OR --actually mutually exclusive
(
MyTable.Date IS NULL AND
MyTable.Int >= intValue and Table.Int < intValue
)
答案 1 :(得分:1)
只要我正在解释你想要正确做的事情,这种做法并不是那么远离伪代码。
SELECT SUM(Value)
FROM T
WHERE
CASE WHEN DateValue IS NOT NULL
THEN DateValue BETWEEN FromDate AND ToDate
ELSE IntValue BETWEEN FromInt AND ToInt
END