使用 CASE WHEN 和 IN 在 SQL 中创建计算列

Posted

技术标签:

【中文标题】使用 CASE WHEN 和 IN 在 SQL 中创建计算列【英文标题】:Create a calculated column in SQL using CASE WHEN and IN 【发布时间】:2020-10-28 06:10:40 【问题描述】:

如何创建一组新的列来搜索特定代码的行并根据 Oracle SQL 和 mysql 中的搜索条件标记是或否?

背景:

我有一个客户代码表,其中包含约 20 多列与 CustomerID 记录相关联的代码。不幸的是,这些列没有绑定到特定的代码,因此,每一列都可以包含任何代码。

Customer Code 

CustomerID |col1|col2|col3|col4|col5|...|col20|
-----------------------------------------------
A          | 0   |  0 |  10| 19 | 200|...| 50 |
B          | 1   | 5  | 19 | 0  | 50 |...| 8  |
...   

目标是创建一个子查询,其中包含多个带有客户 ID 的列,这些列将指示客户是否具有与其关联的特定代码。例如,创建一个 Code 10、Code 19 和 Code 5 列,如果每个 CustomerID 在表的 20 列中的任何一个列中有代码 10、19 或 5,则标记为“Y”,

结果看起来像这样..(新列以粗体显示)

CustomerID |col1|col2|col3|col4|col5|...|col20| **Code 10**| **Code 19** | **Code 5**
------------------------------------------------------------------------------------
A          | 0   |  0 |  10| 19 | 200|...| 50 |  **Y**     |    **Y**    | **N**
B          | 1   | 5  | 19 | 0  | 50 |...| 8  |  **N**     |    **Y**    | **Y**
...

在 Excel 中工作的当前进程: 在 Excel 中,我将创建一个名为“所有代码”的新列,并将所有包含代码的列连接起来。

新列将如下所示:

|      All Codes      |
----------------------
|0 0 10 19 200 ... 50 | 
|1 5 19 0  50   ... 8 |

创建连接辅助列后,我使用 if 和包含文本函数为我需要的每个代码创建一个新列。结果如下所示:

|    All Codes        | Code 10 | Code 19 | Code 5 
-------------------------------------------------------
|0 0 10 19 200 ... 50 |  Y      |  Y      | N
|1 5 19 0  50   ... 8 |  N      |  Y      | Y

然后我将删除所有代码并将新表与 CustomerID 表连接起来。

感谢您的宝贵时间!

【问题讨论】:

规范化你的数据。 什么是'contains ~20+ columns'是固定的或不固定的列数? 是的,认真考虑修改你的架构 谢谢大家,非常感谢您的建议!数据架构设计得很糟糕,不幸的是,我被这些杂乱无章的数据困住了。列固定为 24,但代码超过 50 个。 (50 岁后停止计数)。 【参考方案1】:

使用casein

select t.*,
       (case when 10 in (col1, col2, . . .)
             then 'Y' else 'N'
        end) as cod_10,
       (case when 19 in (col1, col2, . . .)
             then 'Y' else 'N'
        end) as cod_19,
       (case when 5 in (col1, col2, . . .)
             then 'Y' else 'N'
        end) as cod_5
from t;

. . . 用于其余代码列。

这是标准 SQL,应该适用于任何数据库。

我建议您更改数据结构。您应该有一个表,每个表 customerIdcode 各有一行,customerCodes 表。

【讨论】:

【参考方案2】:

在你的非规范化结构上,你可以使用类似

WITH cte AS ( SELECT *, CONCAT_WS(',', col1, col2, ... , col20) total
              FROM source_table )
SELECT *, CASE WHEN FIND_IN_SET(10, total) THEN 'Y' ELSE 'N' END AS Code10
FROM cte

【讨论】:

治病不如治病 @Strawberry 同意。但作为一个临时解决方案,在数据规范化完成之前,它会做。 暂时没有这种东西 @Strawberry 没有什么比暂时的更持久? @Akina 谢谢!我会在早上测试这个。我很感激!

以上是关于使用 CASE WHEN 和 IN 在 SQL 中创建计算列的主要内容,如果未能解决你的问题,请参考以下文章

Sql文的where中使用case when

sqlserver case when问题

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL查询语句SELECT中带有case when嵌套子查询判断的问题

Hive中case when的两种语法