【问题标题】:SQL - Selecting two Columns with two different conditionsSQL - 选择具有两个不同条件的两列
【发布时间】:2021-07-10 16:46:19
【问题描述】:

我正在尝试使用 SQL 上的单个查询在同一个表上选择具有 2 个不同条件的 2 列。

我的表结构如下

| id | from_cur | to_cur | cur_rate |
|----|----------|--------|----------|
| 1  | BTC      | USDT   | 1.2      |
| 3  | BTC      | BUSD   | 1.5      |
| 4  | BTC      | EUR    | 2.4      |
| 4  | BTC      | BNB    | 1.6      |
| 5  | BTC      | BTC    | 1        |
| 6  | BNB      | USDT   | 1.8      |
| 7  | BNB      | BUSD   | 1.02     |
| 8  | BNB      | EUR    | 2.34     |
| 9  | BNB      | BTC    | 1.34     |
| 10 | BNB      | BNB    | 1        |

我需要从用户输入中为from_curto_cur 显示cur_rate,还需要为默认的to_cur 显示cur_rate 考虑为BTC

如果from_cur 是 BNB 而to_cur 是 EUR,这就是我想要的结果

 | cur_rate | default_rate |
 |----------|--------------| // cur_rate = BNB to EUR
 | 2.34     | 1.34         | // default_rate = BNB to BTC

以下是我试过的查询

SELECT   
     CASE
            WHEN to_cur = 'EUR'
                THEN cur_rate
            ELSE 0
            END AS cur_rate,
     CASE
            WHEN to_cur = 'BTC'
                THEN cur_rate
            ELSE 0
            END AS default_value
FROM currency_rates
WHERE from_cur = 'BNB'

这会导致 n 行为 0,如下所示。

+----------+---------------+
| cur_rate | default_value |
+----------+---------------+
|        0 |          1.34 |
|        0 |             0 |
|     2.34 |             0 |
|      .   |          .    |
|      .   |          .    |
|      0   |          0    |
+----------+---------------+

我不希望显示 0 的条目,因此尝试在 WHERE 子句中使用 CASE 语句别名,但这不起作用,因为 WHERE 是在 SELECT 列表之前计算的。

谁能建议我如何通过单个查询在 SQL 中实现这一点?

【问题讨论】:

    标签: mysql sql where-clause


    【解决方案1】:

    您可以使用以下查询

    SELECT   
         max(CASE WHEN to_cur = 'EUR' THEN cur_rate ELSE 0 END) as cur_rate,
         max(CASE WHEN to_cur = 'BTC' THEN cur_rate ELSE 0 END) as default_value
    FROM currency_rates 
    WHERE from_cur = 'BNB'
    

    【讨论】:

    • coalesce() 无关紧要。
    【解决方案2】:
    select c.cur_rate, c2.cur_rate default_value 
    from currency_rates c 
        join currency_rates c2 on c.from_cur=c2.from_cur and c2.to_cur='BTC' 
    where c.from_cur='BNB' and c.to_cur='EUR'
    

    【讨论】:

      【解决方案3】:

      您能否说明如何使用它?如果您要检索 from_curto_cur 的单个组合的输出,则以下内容可能有用:

      select  
           a.cur_rate
          ,b.default_rate
      from
      (
      select 
          cur_rate
      from
          table
      where
          from_cur = from_cur_inp #'BNB'
      and 
          to_cur = to_cur_inp #'EUR'
      )a
      cross join
      (
      select
          cur_rate as default_rate
      from
          table
      where
          from_cur = from_cur_inp #'BNB'
      and
          from_cur = default_cur #'BTC'
      )b
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2023-03-17
        • 2020-03-17
        • 2020-05-21
        相关资源
        最近更新 更多