繁体   English   中英

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

[英]SQL - Selecting two Columns with two different conditions

我正在尝试使用 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        |

我需要显示cur_ratefrom_curto_cur来自用户的输入,也需要显示cur_rate默认to_cur考虑为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 中实现这一点?

您可以使用以下查询

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的单个组合的输出,则以下内容可能有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM