Обновление столбца на основе другого столбца - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть следующая таблица:

ID  Type    Food    Drink   Animal
--------------------------------------
1   NULL    Y   N   N
2   NULL    Y   N   N
3   NULL    N   Y   N
4   NULL    N   Y   N
5   NULL    N   N   Y

Как я могу обновить столбец Тип, основываясь на том, что логическое значение истинно в других столбцах.Например, если столбец «Еда» имеет значение «истина», типом будет «Еда» и т. Д.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2011

Правильный ответ (согласно комментарию) - иметь нормализованную базу данных - тогда это не будет проблемой.

Неправильный ответ:

UPDATE badtable
SET type=(
    CASE
      WHEN Food='Y' THEN 'FOOD'
      WHEN Drink='Y' THEN 'DRINK'
      WHEN Animal='Y' THEN 'ANIMAL'
      ELSE 'WTF?'
)
WHERE type IS NULL
AND (Food='Y' OR Drink='Y' OR Animal='Y');
3 голосов
/ 11 ноября 2011

Вы можете использовать CASE внутри UPDATE запроса:

UPDATE tbl SET Type = 
  CASE
    WHEN Food = 'Y' THEN 'Food'
    WHEN Drink = 'Y' THEN 'Drink'
    WHEN Animal = 'Y' THEN 'Animal'
  END
WHERE ...some condition if necessary...

Однако, это, вероятно, совсем не обязательно. Вы могли бы рассмотреть создание представления, которое показывает вам эту информацию, а не хранить ее в столбце. В случае изменения других логических значений вам необходимо будет всегда обновлять столбец Тип, чтобы он совпадал.

CREATE OR REPLACE VIEW type_vw AS (
  SELECT
      ID, 
      CASE
        WHEN Food = 'Y' THEN 'Food'
        WHEN Drink = 'Y' THEN 'Drink'
        WHEN Animal = 'Y' THEN 'Animal'
      END as Type
  FROM tbl
);
1 голос
/ 11 ноября 2011

Вам не нужен столбец Type, вы можете получить эту информацию, например:

select ID, 
    case 
        when Food='Y' then 'Food'
        when Drink='Y' then 'Drink'
        when Animal='Y' then 'Animal'
        else 'None'
    end as Type
from mytable

Но я рекомендую вам изменить схему, чтобы у вас была отдельная таблица Type с столбцами TypeID иНазвание.Затем в основной таблице у вас будет столбец TypeID.

Если существует требование, чтобы у объекта могло быть более одного типа, вы бы добавили таблицу пересечений.

0 голосов
/ 11 ноября 2011

хммммм, я думаю, что ваша структура таблицы неверна. было бы лучше иметь типы, например, пищевой напиток животного в поиске со ссылкой из родительской таблицы, например,

родительская таблица

id Type
-------
1  1
2  1
3  2
4  3

поиск

id name
-------
1  food
2  drink
3  animal

тогда вы можете просто сделать соединение на столах

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