我有一张如下表:
ID|Prototype_A|Prototype_B|Prototype_C|Prototype_D|
---------------------------------------------------
1 |Fast381A |Blue4812 | Green7181 | White4812 |
---------------------------------------------------
2 |Slow841C |Orange8312 | null | null |
---------------------------------------------------
3 |Plane281K | null | null | null |
---------------------------------------------------
我需要查询返回该ID的所有非null原型。 例如:
有没有办法让通配符选择所有列,例如select(Prototype_*)
,还是应该以不同的格式设置我的表?
例如,我被教导过这种结构是不好的做法:
ID|Prototypes|
---------------------------------------------------
1 |Fast381A,Blue4812,Green7181,White4812
---------------------------------------------------
2 |Slow841C,Orange8312
---------------------------------------------------
3 |Plane281K
---------------------------------------------------
答案 0 :(得分:2)
SQL查询返回一组固定的列。如果要将非NULL值组合到一个列中,我建议concat_ws()
:
select id,
concat_ws(',', Prototype_A, Prototype_B, Prototype_C, Prototype_D)
from t;
忽略NULL
值。查询返回两列,一列是原型列表。
而且,你的问题的答案是"是"。您应该考虑更改数据结构。有多个列存储相同的东西,只有一个索引标识它们通常意味着你想要一个单独的表,每个id和每个原型有一行。
编辑:
你想要一个这样的表:
create table ModelPrototypes (
ModelProtypeId int primary key auto_increment,
ModelId int not null,
ProtoTypeChar char(1),
Prototype varchar(255)
);
然后你会用以下值填充它:
1 A Fast381A
1 B Blue4812
1 C Green7181
1 D White4812
我不确定是否真的需要PrototypeChar
,但信息在您的表格中。
答案 1 :(得分:0)
没有通配符选择列的方法。
你能做什么:
将您的表设置为
ID, Prototype_type, Prototype_name
然后使用GROUP_CONCAT
:
SELECT id, GROUP_CONCAT(Prototype_name SEPARATOR ',')
FROM table GROUP BY Prototype_name
答案 2 :(得分:0)
"Should I setup my table in a different format?"
是。您的表格可能如下所示:
ID Prototype_Code Prototype
------------------------------
1 A Fast381A
1 B Blue4812
1 C Green7181
1 D White4812
2 A Slow841C
2 B Orange8312
3 A Plane281K