【问题标题】:Using a Select query to change the Value for two tables depending on a condition使用 Select 查询根据条件更改两个表的值
【发布时间】:2020-10-11 16:06:28
【问题描述】:

目标:我想创建一个 Select 查询,其中结果包含两个表中的所有记录,但时隙除外。除此之外,我还想要一个条件,如果停车分钟数为 0 或 Null,则该字段的值应设置为 -1。

进度:在当前状态下,我合并了两个表,可以将 0 值设置为 -1。由于我对 SQL 很陌生,我找不到将原始值保留几分钟并集成“When Null Then -1”子句的解决方案。许多解决方案建议使用 Update 查询,但操作需要在 Select 结果中。 MYSQL 2017。到目前为止,这是我的代码:

Select c.ID, c.status, c.Date, Case When c.Minutes = 0 Then -1 End as Minutes
From Customer_1 as c
Union
Select c1.ID, c1.status, c1.Date, Case When c1.Minutes = 0 Then -1 End as
Minutes
From Customer_2 as c1 

原始数据集:我有两个列名完全相同的表,代表用户 ID

客户_1:

ID| Date| Minutes| Time| status
1 | 2019| 3      | 2019| A
2 | 2019| 0      | 2019| A

客户_2:

ID| Date| Minutes| Time| status
3 | 2019| Null   | 2019| A
4 | 2019| 0      | 2019| A

最终查询应该是什么样子:

ID| Date| Minutes| status
1 | 2019| 3      | A
2 | 2019| -1     | A
3 | 2019| -1     | A
4 | 2019| -1     | A

任何关于如何构建满足标准的工作查询的建议将不胜感激!

【问题讨论】:

  • 我将 Coalesce 语句安装到两个 Select 语句中,并将所有 Null 和 0 值交换为 -1,但为第一个用户消除了值 3。不幸的是,这与我在任务中遇到的问题相同。如果我在列上运行操作,我会丢失原始值 3。不知何故,我需要一个操作,让值高于 0 的用户保持其原始值。
  • 我认为您仍然缺少 CASE 子句的 ELSE 部分,即如 Barbaros 的回答中所述的 Case When Coalesce(c.Minutes, 0) = 0 Then -1 Else c.Minutes End..

标签: mysql sql null case union


【解决方案1】:

只需使用Coalesce() 函数并在您的Case .. When 语句中添加Else 部分即可:

Select ID, status, Date, Case When Coalesce(Minutes,0) = 0 Then -1 Else Minutes End as Minutes
  From Customer_1 
 Union
Select ID, status, Date, Case When Coalesce(Minutes,0) = 0 Then -1 Else Minutes End
  From Customer_2

在这种情况下,为表使用别名是多余的,因为查询是独立的,除了Union。第二个查询的别名(Minutes)也是多余的。

另一种选择可能是使用IF 语句和COALESCE() 函数:

Select ID, status, Date, IF(Coalesce(Minutes,0) , Minutes, -1) as Minutes
  From Customer_1 
 Union
Select ID, status, Date, IF(Coalesce(Minutes,0) , Minutes, -1)
  From Customer_2 

Demo

【讨论】:

  • 谢谢!你的建议真的很有帮助!由于可能有更多表,我最终可能会使用 Join。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2017-08-31
  • 2014-09-16
  • 2023-04-09
相关资源
最近更新 更多