使用 Case When 将 1 列拆分为多列同时忽略空值

Using Case When to Split 1 Column Into Many While Ignoring Null Values

我是 SQL 的新手,尝试了很多搜索但无法完成我想要的。

我的自定义字段值包含在一个 table 列中,每个自定义字段都有自己的 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 语句只是 returns NULL 对于每个不匹配 customfieldid 的字段。

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) 在它自己的列中获取每一行的信息值。

您正在使用 EAV 数据模型。本质上,您希望每个 属性 customfieldid) 你想要 return 给定的一组 entities (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