Если NOT NULL, тогда UPDATE, иначе сохраните значение поля

10

Я думаю, что я как-то близок, чтобы заставить это работать, но по некоторым причинам я все еще получаю ошибки.

У меня есть следующий запрос ОБНОВЛЕНИЕ:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

Параметры заполняются разными пользователями. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что даже если вы хотите обновить одно поле, вам все равно придется заполнить старыми данными другие параметры. Поэтому я хотел бы установить опцию IF @parameter IS NULL THEN, чтобы сохранить значение, которое уже сохранено в БД. Я попытался найти какое-то решение, и похоже что-то вроде следующего запроса, но я не могу заставить его работать:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

БД хранится в SQL Server 2008

Заранее спасибо за помощь.

РЕДАКТИРОВАТЬ для уточнения:

Оригинальная таблица выглядит так

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

По причинам публикации я сделал запрос, чтобы перевернуть таблицы. Таким образом, при выполнении запроса Select таблица возврата выглядит следующим образом

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

Я создал пользовательский интерфейс, чтобы пользователи системы могли обновлять различные поля, такие как Аксессуары, Описание, Спецификация. Обновление работает, если я обновляю все поля с помощью запроса, показанного вверху. Однако, когда я оставляю текстовое поле пустым, я получаю сообщение об ошибке, что в @parameter отсутствует значение. Так что пытаясь найти решение, нужно обновить только ту область, где что-то написано. Поэтому, если @parameter IS NULL, сохраните исходное значение в БД. Я нашел другое решение, которое действительно близко к тому, что я хочу, но не может заставить его работать. Вот другое решение: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

молокосос
источник
Можете ли вы предоставить эту точную ошибку? Это ошибка SQL-сервера или ошибка в вашем (UI) приложении? Какое UPDATEутверждение пользовательский интерфейс отправляет в базу данных?
ypercubeᵀᴹ
Вы можете добавить это в вопросе? Это может быть связано с тем, как построено утверждение и какие цитаты используются. Это '@'Accessoriesне имеет смысла для меня.
ypercubeᵀᴹ
1
Я думаю, что ваш код пользовательского интерфейса может не выдавать правильные утверждения. Покажите нам код, который вы имеете, и выдает ошибку, а не псевдокод.
ypercubeᵀᴹ
Я хочу поблагодарить вас за помощь. Извините за отсутствие опыта. Мне удалось найти ошибку, и вы были правы, проблема была на уровне пользовательского интерфейса. Большое спасибо за помощь. В случае, если кто-то ищет аналогичный ответ, я использовал первое решение
Greenhorn

Ответы:

13

Я думаю, что это решит проблему:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;

или это (чтобы избежать избыточных обновлений):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;

или это, используя конструктор табличных значений:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;
ypercubeᵀᴹ
источник
Спасибо за быстрый ответ. Я попробую это и сообщу вам о результате.
Гринхорн
Вы имеете в виду второе решение в моем ответе?
ypercubeᵀᴹ
да, я пробую 3-е решение, я проголосовал за ответы, потому что это дает много возможностей. Я связываю третье, и если я заставлю его работать, я тоже приму это.
Гринхорн
Все должно работать. Если это не так, вы можете отредактировать свой вопрос и добавить структуру таблицы (оператор Create Table) и хранимую процедуру. Там может быть что-то важное, что я неправильно понял, или вы не упомянули.
ypercubeᵀᴹ
Id эти ответы работают, когда все параметры не равны NULL, но не работают, когда один из них имеет значение NULL, а затем посмотрите на код пользовательского интерфейса и как он обрабатывает NULL при создании запроса. И вы можете добавить этот (UI) код в вопросе.
ypercubeᵀᴹ