SQL возвращает только непустые столбцы из строки как новую строку - PullRequest
2 голосов
/ 12 января 2012

Я нахожусь в ситуации, когда мой клиент посылает мне по электронной почте файл 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

И я бы предпочел не решать эту проблему в PHP-коде, пропуская пустые строки = P

Пример строки (сначала имена столбцов):

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 голосов
/ 12 января 2012

Звучит так, как будто вы хотите преобразовать вашу таблицу в две таблицы:

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)
);

Затем вы можете загрузить заполненные столбцы из исходной таблицы в эти два. В худшем случае было бы 40 записей в IngredientProperties для одной записи в Ingredient. Вы могли бы сделать 'property' ссылкой на внешний ключ для определения списка возможных свойств ингредиента (третья таблица, которая определяет возможные значения для свойств - в основном, запись имен столбцов из вашей исходной таблицы). Если вы добавите третью таблицу, она может также логически называться IngredientProperties (в этом случае таблицу, которую я назвал IngredientProperties, необходимо переименовать.

Затем вы можете присоединиться к Ingredients и IngredientProperties, чтобы получить необходимую информацию.

Я не уверен, что рекомендую это решение; это в основном использование подхода «Entity Attribute Value» к проектированию базы данных. Тем не менее, для чрезвычайно разреженной информации, как вы, кажется, и при использовании с ограничением третьей таблицы.

То, что вы не можете разумно сделать, это обработать все возможные комбинации из 40 столбцов, так как это число растет экспоненциально с числом столбцов (и довольно велико с N = 40).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...