如何在表的每一行中查找哪一列包含特定值

Posted

技术标签:

【中文标题】如何在表的每一行中查找哪一列包含特定值【英文标题】:How to find which column contains a specific value in a each row of a table 【发布时间】:2020-03-18 08:10:07 【问题描述】:

我有一个表,其中的列是动态的,也就是说,有六列 C1、C2、C3、V1、V2、V3。

C1、C2、C3 包含一个字段,对应的值插入到 V1、V2、V3 中。

在一行中,field1 可以在 C2 列中,相应的值将在 V2 中。对于特定 ID(固定列)。 在下一行中,field1 可以在 C1 列中,对应的值将在 V1 中,用于不同的 ID。

在这种情况下,我们如何才能找到哪个列包含特定 ID 的 field1。

预期结果是

【问题讨论】:

使用具有适当 WHERE 的 UNION ALL 对您的数据进行 UNPUVOT,然后查询单对 (ID-C-V) 表。 请向我们展示您的预期结果。 这种问题是架构设计不佳的症状 @Strawberry 这是一个银行交易表,对于特定的 tnx,不同的字段不会同时出现。一旦其他当局确认,一些字段和值会在一天或两天后出现。 @VBoka 为预期结果编辑 【参考方案1】:

规范化的模式可能看起来像这样...

id  x c v   
111 1 3 30 
222 1 1 10 
333 1 2 20 

111 2 1 10
222 2 2 20
333 2 3 30

111 3 2 20
222 3 3 30
333 3 1 10

...可以在 (id,x) 上形成自然 PK

【讨论】:

【参考方案2】:

在同一条记录中,field1只能在一个Cx Column中

SELECT id, CASE WHEN C1='Field1' THEN V1
                WHEN C2='Field1' THEN V2
                WHEN C3='Field1' THEN V3
                ELSE NULL
                END field1
FROM sourcetable
/* uncomment the next line 
   if 'Field1' value may be in none Cx column, 
   and you do not need in such records */
/* HAVING field1 IS NOT NULL */

【讨论】:

以上是关于如何在表的每一行中查找哪一列包含特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何在表的一个字段中按最小值分组,保留同一行中的所有值?

如何查找一行不包含另一列中的值

如何替换包含完整句子的列的每一行中的多个单词?

SQL查询查找表的主键?

如何根据一列是不是具有特定值来查找重复行并删除输出?

根据列中的状态更改创建触发器并在表的另一列中插入值