4

也许您可以通过 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 一定很简单,但我想不通!

提前致谢。

4

5 回答 5

9

伪代码也是:

select id, coalesce(price_brl, price_usd * tbl_2.value) 
from tbl_1
inner join tbl2
于 2009-02-03T17:34:38.703 回答
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

显然,您需要调整连接。但我认为这会奏效。

于 2009-02-03T17:36:22.693 回答
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...
于 2009-02-03T17:37:37.887 回答
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*/

但我会推荐上面的 Coallesce 选项(如果您有 3 个或更多选项)或 IsNull(因为看起来您有 2 个选项)。

于 2009-02-03T18:01:37.120 回答
0

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

从 tbl1 中选择 udf_getPrice(id)

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

于 2009-02-03T17:45:52.753 回答