我试图在查询的select语句上实现某种逻辑。我想要它,如果没有给出属性,或者inAttribute是'NONE';它将返回日期和所有值(compprice,compspread,price,spread,run)。
如果在属性中给出了一个值,那么我希望它返回它请求的值(参考我试图做的case语句)。
以下是我的尝试,它只是不起作用。有什么帮助吗?
SELECT
mi.date,
IF inAttribute = '' THEN
mi.compprice,
mi.compspread,
mi.price,
mi.spread,
mi.run
ELSE
CASE inAttribute
WHEN 'CP' THEN mi.compprice,
WHEN 'CS THEN mi.compspread,
WHEN 'MP' THEN mi.price,
WHEN 'MS' THEN mi.spread,
WHEN 'R' THEN mi.run
END
END IF
FROM userValueTable mi
WHERE mi.index_family = inIdxFamily
AND mi.index_id = inIdxId
AND mi.date_>= inStartDate
AND mi.date_<= inEndDate
ORDER by mi.date_ ASC;
答案 0 :(得分:2)
几点评论
答案 1 :(得分:0)
Oracle SQL中没有IF,仅在PL / SQL中。你必须将它重写为CASE。与您在ELSE部分中的查询中所做的相同(在'CS'之后,您错过了一个结束引用...)。
SELECT ...
(CASE WHEN inAttribute IS NULL THEN mi.compprice
WHEN .... THEN...
WHEN .... THEN...
...
ELSE ...
END) AS some_column_alias
FROM ...
答案 2 :(得分:0)
Oracle没有SQL IF
。请改用CASE
- 它可以像您在查询中一样使用C / C#/ Java / etc switch - case
,它也可以像if
一样。
另外,如上所述:
''
被视为NULL,而不是= ''
使用IS NULL
。如果您不想转到动态SQL,可以在选择列表中添加“类型”列,然后将任何不适用的值清空。您的下游逻辑可以根据类型选择要使用(或忽略)的值。这是一个例子:
SELECT
mi.date,
CASE
WHEN inAttribute IS NULL THEN 'inAttrNull'
ELSE 'inAttrNotNull'
END AS RecordType,
CASE WHEN inAttribute IS NULL THEN mi.compprice END AS compprice,
CASE WHEN inAttribute IS NULL THEN mi.compspread END AS compspread,
CASE WHEN inAttribute IS NULL THEN mi.price END AS price,
CASE WHEN inAttribute IS NULL THEN mi.spread END AS spread,
CASE WHEN inAttribute IS NULL THEN mi.run END AS run,
CASE inAttribute
WHEN 'CP' THEN mi.compprice
WHEN 'CS' THEN mi.compspread
WHEN 'MP' THEN mi.price
WHEN 'MS' THEN mi.spread
WHEN 'R' THEN mi.run
END AS SpecialValue
FROM userValueTable mi
... and your WHERE and ORDER BY clauses
你会得到一个像这样的结果集:
RecordType compprice compspread price spread run specialvalue
------------- ---------- ---------- ---------- ---------- ---------- ------------
inAttrNotNull (null) (null) (null) (null) (null) 1234.56
inAttrNull 111.11 222.22 333.33 444.44 555.55 (null)
我知道这不是你想要的,但它可能是你可以作为替代品使用的东西。