在忽略Null值的情况下使用Case何时将1列拆分为多个

时间:2018-12-05 18:50:39

标签: mysql mysql-workbench fishbowl

我对SQL还是很陌生,已经尝试了很多搜索,但是无法完成我想要的。

我有一个包含在一个表和一列中的自定义字段值,每个自定义字段都有自己的ID,但是存储的值位于一列中。

我试图为每个自定义字段获取1列及其相关值,这是我的查询:

SELECT PRODUCT.id AS ProductId, PRODUCT.num AS ProductNumber, 
CASE WHEN customvarcharlong.customfieldid = '6' THEN customvarcharlong.info 
END AS OEM1Name, 
CASE WHEN customvarcharlong.customfieldid = '7' THEN customvarcharlong.info 
END AS OEM1NumbersA
FROM product
JOIN customvarcharlong ON product.id=customvarcharlong.recordid
JOIN customfield ON customvarcharlong.customfieldid=customfield.id
WHERE PRODUCT.activeFlag = TRUE
ORDER BY PRODUCT.id

我的问题是,对于每个具有值的自定义字段,我都会得到一行,而case语句对于与customfieldid不匹配的每个字段都返回NULL。

2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   Comp1   NULL
2   00007   NULL    1234
2   00007   NULL    NULL
2   00007   NULL    NULL

这是我想要的结果:

2   00007   Comp1   1234

使用where或group by可以消除某些数据,因为它们位于不同的行中。这可能吗?我要添加48个自定义字段,因此您可以想像正确将节省大量工作。

谢谢!

编辑以添加来自customvarcharlong的示例数据:

+--------+---------------+-------+----------+
|   id   | customFieldId | info  | recordId |
+--------+---------------+-------+----------+
| 170887 |           171 | N     |     1481 |
| 170888 |           172 | 3.03  |     1481 |
| 170889 |           173 | new   |     1481 |
| 170890 |           170 | 0     |     1481 |
| 170891 |             5 | 0     |     1481 |
| 170892 |             6 | OEM1  |     1481 |
| 170893 |             7 | Num1  |     1481 |
| 170894 |           200 | 4184  |     1481 |
| 170895 |           120 | Truck |     1481 |
+--------+---------------+-------+----------+

您可能会说出问题是存在许多自定义字段值的recordid重复,并且customfieldid在每个recordid上重复。我想获取每个recordid(recordid = productid)自己列中每一行的信息值。

1 个答案:

答案 0 :(得分:1)

您正在使用EAV数据模型。本质上,您要为要返回给定值的每个属性customvarcharlong)单独向左联接 values 表(customfieldid实体product)的集合。

尝试一下:

SELECT PRODUCT.id AS ProductId, 
       PRODUCT.num AS ProductNumber, 
       cvcl6.info AS OEM1Name, 
       cvcl7.info AS OEM1NumbersA
FROM product
    LEFT JOIN customvarcharlong cvcl6
        ON product.id=cvcl6.recordid
            AND cvcl6.customfieldid = '6'
    LEFT JOIN customvarcharlong cvcl7
        ON product.id=cvcl7.recordid
            AND cvcl7.customfieldid = '7'
WHERE PRODUCT.activeFlag = TRUE
ORDER BY PRODUCT.id