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_cur
和 to_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 行,如下所示。
+----------+---------------+
| 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_cur 和 to_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
我正在尝试 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_cur
和 to_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 行,如下所示。
+----------+---------------+
| 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_cur 和 to_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