Поиск первого пустого столбца в строке данных

Я видел похожие вопросы, и большинство из них превратилось в споры о дизайне таблиц, нормализации и т. Д. Не все из нас могут позволить себе позволить нашим клиентам изменить дизайн своих баз данных.

Вот моя дилемма. Мой клиент просит, чтобы я позволил их работникам добавить время вызова за предыдущий день. Я предоставлю всплывающее окно, чтобы разрешить им ввести callout_start и callout_stop за день до этого. У многих уже есть вызовы за предыдущий день.

      CREATE TABLE MyTable(
empNo int NOT NULL,
workDate datetime NOT NULL,
callout_start1 datetime NULL,
callout_stop1 datetime NULL,
callout_start2 datetime NULL,
callout_stop2 datetime NULL,
callout_start3 datetime NULL,
callout_stop3 datetime NULL,
callout_start4 datetime NULL,
callout_stop4 datetime NULL,
callout_start5 datetime NULL,
callout_stop5 datetime NULL,
callout_start6 datetime NULL,
callout_stop6 datetime NULL,
callout_start7 datetime NULL,
callout_stop7 datetime NULL,
callout_start8 datetime NULL,
callout_stop8 datetime NULL,
callout_hours decimal(5, 2) NULL
)

Я хочу, чтобы они могли обновлять следующие доступные выноски предыдущего дня. IOWs - первая выноска с нулевым значением. SQL должен быть универсальным. Я пишу в базу данных dbIsam, которая будет синхронизироваться с базой данных MS/SQL через remObjects.
Спасибо

1 ответ

Решение

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

      with toupdate as (
      select t.*,
             (case when callout_start1 is null then 1
                   when callout_start2 is null then 2
                   . . .
              end) as which
      from t
     )
update toupdate
    set callout_start1 = (case when which = 1 then @param else callout_start1 end),
        callout_start2 = (case when which = 2 then @param else callout_start2 end),
        . . . 
    where <whatever>;
               
Другие вопросы по тегам