SQL - 选择两个具有两个不同条件的列

SQL - Selecting two Columns with two different conditions

我正在尝试 select 在同一 table 上使用 2 个不同条件的 2 列,并在 SQL.

上进行单个查询

我的table结构如下

| 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_curcur_rate,还需要显示默认 to_curcur_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 行,如下所示。

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

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

任何人都可以建议我如何通过单个查询在 SQL 中实现此目的吗?

您可以使用以下查询

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'
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'

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

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