条件选择列

时间:2009-02-03 17:32:47

标签: sql database conditional

也许你可以帮我一个SQL查询:

我在辅助表中有一个转换值,结构如下:

ID PRICE_BRL PRICE_USD
-- --------- ---------
1  10        5
2  12        NULL
3  NULL      3
4  14        NULL
5  NULL      4
6  NULL      NULL

我需要一个结果集就像优先考虑第一列一样,如果为NULL,则给出第二列值乘以存储在辅助表中的转换值。像伪代码那样的东西:

SELECT 
  id, 
  (
   IF (price_brl != null) 
     price_brl
   ELSE 
     price_usd * tbl_2.value
  ) as final_price
FROM tbl_1

我认为使用Joins一定很简单,但我无法理解!

提前致谢。

5 个答案:

答案 0 :(得分:9)

伪代码:

select id, coalesce(price_brl, price_usd * tbl_2.value) 
from tbl_1
inner join tbl2

答案 1 :(得分:3)

select  id, isnull( price_brl, price_usd * tbl_2.value)
from    tbl_1
    inner join tbl_2
        on tbl_1.id=tbl_2.id

显然,你需要调整连接。但我认为这样做会有所作为。

答案 2 :(得分:3)

coalesce()语句完全按照您在示例中要执行的操作,它在字段中测试null,然后在它为null时提供不同的值。但是如果你想做除了测试null之外的事情(并且它也适用于null)你可以使用case语句:

SELECT id, CASE WHEN price_brl != NULL THEN price_brl ELSE price_usd * tbl_2.value END as final price...

答案 3 :(得分:1)

另一种方式是:

SELECT id, 
CASE WHEN price_brl IS NULL THEN (price_usd * tbl_2.Value)
ELSE 
price_brl
END AS Final_Price
FROM tbl_1
JOIN tbl_2 ON /*Join Conditions and then Where conditions*/

但我建议使用上面的Coalesce选项(如果你有3个或更多选项)或IsNull(因为看起来你有两个选择)。

答案 4 :(得分:0)

假设您正在使用SQL Server或其他支持用户定义函数的系统,我会考虑创建一个封装逻辑的函数,这样我的选择就是

从tbl1

中选择udf_getPrice(id)

虽然这会产生一些开销,但从你的问题来看,我似乎不会对性能对查询至关重要。使用函数的优点是您使用的查询类型是可能发生业务更改的类型 - 例如,除了美元之外,您可能开始以欧元或日元开始采购,或者用于计算的规则可能会发生变化。将转换逻辑封装在一个函数中将添加一个抽象层,可以为将来的维护带来丰厚的回报。