也许你可以帮我一个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一定很简单,但我无法理解!
提前致谢。
答案 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)虽然这会产生一些开销,但从你的问题来看,我似乎不会对性能对查询至关重要。使用函数的优点是您使用的查询类型是可能发生业务更改的类型 - 例如,除了美元之外,您可能开始以欧元或日元开始采购,或者用于计算的规则可能会发生变化。将转换逻辑封装在一个函数中将添加一个抽象层,可以为将来的维护带来丰厚的回报。