SQL只返回行中的空行而不是新行

时间:2012-01-12 16:06:37

标签: php sql select if-statement subquery

我遇到的情况是,我的客户通过电子邮件向我发送了一个excel文件,其中有50列数据非常规范化。然后我将其导出为CSV并上传到MySQL - 单表。这些列用于不同的成分(每个成分的10列数据 - 标题,类别等),然后是40种不同的列,用于每种成分的特征。因此,表中的每种成分都包含所有这50个色谱柱,即使每个色谱柱都不适用于该成分。

我的问题是,我是否可以创建一个SQL,只为一个选定的成分选择填充的特征并省略所有其他列?

(我知道另一个选择是建立我自己的CSV解析器,创建多个表,然后为他们编写SQL,但我想调查解决这个问题。如果那是不可能的那么我只需面对那个并构建一个解析器; P)

这是我来的,但这并没有完全排除未填写的列(或包含“nei”。

SELECT 
IF(`Heving-vanlig-gjaerbakst` <> '' AND `Heving-vanlig-gjaerbakst` <> 'nei', `Heving-vanlig-gjaerbakst`, 'random') AS `test1`,
IF(`Frys-kort` <> '' AND `Frys-kort` <> 'nei', `Frys-kort`, 'random') AS `test2`
... and for the 38 other rows ...
FROM x
WHERE id = 123

我宁愿不通过跳过空行= P

在PHP代码中解决这个问题

示例行(首先是列名):

g1      gruppe              ug1         undergruppe             artnr   artikkel                beskrivelse                                             status  enhet   ansvar      prisliste   Heving-vanlig-gjaerbakst    Heving-soete-deiger Deig-stabilitet Smaksgiver  Saftighet   Krumme-poring   Skorpe  Volum   Konservering    Skjaerbarhet    Frys-lang   Frys-kort   Kjoel   Holdbarhet  E-fri   Azo-fri Mandler Aprikoskjerner  Helmiks Halvmiks    Base    Konsentrat  Utstrykning Bakefasthet Frukt-Baerinnhold   Slippegenskaper Hindre-koksing  Palmefri    Fritering   Smidighet   Baking  Kreming Roere   Fylning Dekor   Prefert Viskositet  Cacaoinnhold    Fet-innhold
100150  Bakehjelpemidler    100150200   Fiber/potetprodukter    10085   Potetflakes sekk 15 kg  Egnet til lomper, lefser, brød og annet bakverk. B...   Handel  Sekk    Trond Olsen JA          xxx                         xxx                 xxx                                                                                                     

正如您所看到的,大多数列都是空的。 X,XX和XXX是等级系统的一种形式,但对于某些列,内容是“是”或“否”。

正如我所说,前10列是关于该产品的信息,另外40列是不同的特征(这是我想为一种产品使用的那些)。

1 个答案:

答案 0 :(得分:0)

听起来有点像你想把你的表转换成两个表:

CREATE TABLE Ingredients
(
    g1           ...,
    gruppe       ...,
    ug1          ...,
    undergruppe  ...,
    artnr        ... PRIMARY KEY,
    artikkel     ...,
    beskrivelse  ...,
    status       ...,
    enhet        ...,
    ansvar       ...,
    prisliste    ...
);

我已选择猜测artnr是主键,但会对实际主键进行调整。此表包含所有成分共有的十一个(尽管您的问题是十个)列。然后你有另一个表包含:

CREATE TABLE IngredientProperties
(
    artnr       ... NOT NULL REFERENCES Ingredients,
    property    VARCHAR(32) NOT NULL,
    value       VARCHAR(3)  NOT NULL,
    PRIMARY KEY(artnr, property)
);

然后,您可以将原始表中的填充列加载到这两个列中。在最坏的情况下,在IngredientProperties中有40个条目用于成分中的一个条目。您可以制作&#39; property&#39;到可能成分属性的定义列表的外键引用(第三个表定义属性的可能值 - 基本上是原始表中列名的记录)。如果添加第三个表,它可能在逻辑上称为IngredientProperties(也是),在这种情况下,我称为IngredientProperties的表需要重命名。

然后,您可以加入Ingredients和IngredientProperties以获取所需信息。

我不确定我是否推荐此解决方案;它基本上是使用&#39;实体属性值&#39;数据库设计方法。但是,对于您似乎拥有的非常稀疏的信息,以及与第三个表的约束一起使用时。

你可以理解的是处理40列的所有可能组合,因为这个数字随着列数呈指数增长(并且当N = 40时非常大)。