it-swarm-eu.dev

POKUD NENÍ NULL, pak UPDATE jinak ponechá hodnotu pole

Myslím, že jsem nějak blízko, aby to fungovalo, ale z nějakého důvodu stále dostávám chyby.

Mám následující UPDATE dotaz:

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

Parametry vyplňují různí uživatelé. Problém, kterému nyní čelím, je to, že i když chcete aktualizovat jediné pole, musíte ještě doplnit starými daty ostatní parametry. Chtěl bych proto nastavit možnost IF @parameter IS NULL THEN, pak si ponechat hodnotu, která je již uložena v DB. Pokusil jsem se najít nějaké řešení a zdá se, že něco jako následující dotaz je řešení, ale nedokážu to fungovat:

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

THE DB je uložen v SQL Server 2008

Předem děkuji za pomoc.

EDIT pro objasnění:

Původní tabulka vypadá takto

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

Z důvodů publikování jsem provedl dotaz na otočení tabulek. Když je tedy spuštěn výběrový dotaz, návratová tabulka vypadá následovně

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

Vytvořil jsem uživatelské rozhraní, aby uživatelé systému mohli aktualizovat různá pole, jako je příslušenství, popis, specifikace. Aktualizace funguje, pokud aktualizuji všechna pole dotazem zobrazeným nahoře. Když však ponechám textové pole prázdné, zobrazí se chyba, že @parameteru chybí hodnota. Snaží se tedy najít řešení, jak aktualizovat pouze pole, kde je něco napsáno. Pokud tedy @parameter IS NULL, pak si ponechám původní hodnotu v DB. Našel jsem další řešení, které je opravdu blízké tomu, co chci, ale nemůžu ho přimět k práci. Zde je další řešení : https://stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-

10
Greenhorn

Myslím, že to vyřeší problém:

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 ;

nebo toto (aby se zabránilo zbytečným aktualizacím):

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

nebo to pomocí konstruktoru hodnoty tabulky:

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 ;
13
ypercubeᵀᴹ