Обновите множество столбцов флагов, учитывая значение других столбцов (значения NULL) в той же записи.

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

  • Я использую Microsoft SQL Server 2005.
  • Прежде всего мне нужно загрузить данные в целевую таблицу, затем мне нужно выполнить проверки, чтобы поместить значения в эти столбцы флагов.

Скажем, например, у меня есть игрушечный стол, подобный следующему:

CREATE TABLE zzz_test
             (
                          color        VARCHAR(10),
                          value_x      INTEGER    ,
                          value_y      INTEGER    ,
                          value_x_FLAG bit        ,
                          value_y_FLAG bit
             )

Затем у меня есть следующие игрушечные данные (мне нужно повторять операторы INSERT/VALUES для каждой записи из-за «старой» версии SQL 2005 года):

INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',NULL,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',NULL,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,3)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',NULL,1)
INSERT zzz_test(color,value_x,value_y)
VALUES(NULL,3,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',1,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',3,4)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',1,1)
INSERT zzz_test(color,value_x,value_y)
VALUES('blue',5,NULL)

Теперь я хотел бы иметь быстрый способ поместить значения в value_x_FLAG и value_y_FLAG, оценивая, являются ли родственные столбцы value_x и value_y NULL.

Я знаю, что существуют такие функции, как ISNULL() или COALESCE(), но я не думаю, что это так, потому что я пытаюсь обновить столбец, учитывая значение другого столбца.

Я знаю, что могу использовать операторы IF / ELSE, но довольно сложно установить все случаи многих логических флагов (2 ^ n) для совместной работы в одном и том же операторе «обновления» переменных флага.

Как с этим бороться?

После установки всех флагов я хотел бы как-то подытожить свою таблицу. Например, я хотел бы иметь COUNT для всех переменных флага, тогда я хотел бы иметь COUNT для "цветовой категории".

Возможно, мне не нужен набор переменных флага поддержки, но я бы хотел, чтобы они сделали таблицу намного более читаемой, а также код SQL намного более читабельным. Спасибо!


person TPPZ    schedule 07.06.2012    source источник


Ответы (1)


попробуй так после всех вставок сделай

update zzz_test set value_x_FLAG = CASE value_x when null then 1 else 0 END, value_y_FLAG = CASE value_y when null then 1 else 0 END

надеюсь, что это работает!

редактировать: о подсчете, вы можете использовать предложение group by каждый раз, когда вам это нужно, вместо того, чтобы где-то сохранять флаг

select Color, Count(value_x_FLAG) from zzz_test  group by Color having value_x_FLAG != 0

это вернет таблицу из 2 столбцов с цветом, а в другом столбце - количество строк, которые имеют флаг = 1

person Gonzalo.-    schedule 07.06.2012
comment
Я только что попробовал, но он устанавливает все флаги на 0. Я думаю, что должен быть какой-то трюк, чтобы добавить к when null, чтобы система попала в этот случай, есть идеи? - person TPPZ; 07.06.2012
comment
попробуй ..CASE value_x when IS NULL.. - person Gonzalo.-; 07.06.2012
comment
Я также попробовал оператор GROUP BY, но он выдает ошибки, говорящие о том, что столбец в предложении HAVING не содержится ни в агрегатной функции, ни в предложении GROUP BY. - person TPPZ; 07.06.2012
comment
Попытка IS NULL не удалась, из-за неверный синтаксис рядом с ключевым словом 'is'. - person TPPZ; 07.06.2012
comment
попробуйте это select Color, Count(value_x_FLAG) from zzz_test where value_x_FLAG != 0 group by Color Извините за это, я недавно проснулся и работаю, ха-ха. (и извините за плохой английский) - person Gonzalo.-; 07.06.2012