【问题标题】:Conditional SELECT of a column列的条件选择
【发布时间】:2010-10-05 05:15:03
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 可能不是最好的设计。
  • 你能用你的目标数据库来标记这个问题吗?
  • 嗯,我的目标数据库是一个 SQL 数据库......因为我正在抽象数据库。

标签: sql database conditional


【解决方案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 个选项)。

【讨论】:

    【解决方案2】:

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

    从 tbl1 中选择 udf_getPrice(id)

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

    【讨论】:

      【解决方案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...
      

      【讨论】:

        【解决方案4】:
        select  id, isnull( price_brl, price_usd * tbl_2.value)
        from    tbl_1
            inner join tbl_2
                on tbl_1.id=tbl_2.id
        

        显然,您需要调整联接。但我认为这会解决问题。

        【讨论】:

          【解决方案5】:

          还有伪代码:

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

          【讨论】:

            猜你喜欢
            • 2017-10-22
            • 2011-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-07
            • 1970-01-01
            • 2012-10-24
            相关资源
            最近更新 更多