SQL-запрос для обновления столбца на основе данных другого столбца в таблице - PullRequest
0 голосов
/ 06 сентября 2011

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

Кто-нибудь может сказать мне, как написать это?

Пример данных:

ID  Type   Barcode  Serial No  Location

1   Test    ABCD     1234       LOC1  
2   Test    EFGH     NULL       LOC2  
3   Test    NULL     5678       LOC3  
4   Test    NULL     NULL       LOC1  

Окончательные данные в формате

ID  Type  Barcode  Serial No  Location

1   Test  ABCD     1234       LOC1-ABCD   (Append barcode if its not null)  
2   Test  EFGH     NULL       LOC2-EFGH   (Append barcode if its not null)  
3   Test  NULL     5678       LOC3-5678   (Append serial no since barcode is null)  
4   Test  NULL     NULL       LOC1        (Both r Null keep loc as it is)  

Пожалуйста, помогите мне в этом ....действительно застрял на этом: (

База данных Oracle 10.

Supra

Обновление 1:

Большое спасибо Марко за вашу помощь ....поле местоположения необходимо обновлять в таблице только после добавления штрих-кода / серийного номера из той же таблицы в поле местоположения. Ваш отредактированный запрос не работает: (... пожалуйста, дайте мне знать, если мне нужно дать больше информации / данных.

Окончательное обновление:

Ответ Шесека сработал отлично: D ... ты мужчина:) ... Спасибо за тонну: D

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Попробуйте это:

SELECT ID, Type, Barcode, "Serial No",
CASE
  WHEN Barcode IS NOT NULL THEN Location || '-' || Barcode
  WHEN "Serial No" IS NOT NULL THEN Location || '-' || "Serial No"
  ELSE Location
FROM your_table

Взгляните на функцию CASE и String Concat .
Я не уверен, каким образом я избежал Серийный № поле, в любом случае посмотрите здесь

РЕДАКТИРОВАНИЕ:
Попробуйте это:

UPDATE your_table SET Location =
CASE
  WHEN Barcode IS NOT NULL THEN Location || '-' || Barcode
  WHEN "Serial No" IS NOT NULL THEN Location || '-' || "Serial No"
  ELSE Location
0 голосов
/ 06 сентября 2011

Согласно вашему комментарию к другому ответу,

UPDATE Network_Plant_Items
    SET FULL_ADDRESS = 'foobar' || COALESCE(BARCODE, MANUF_SERIAL_NUMBER)
    WHERE BARCODE IS NOT NULL OR MANUF_SERIAL_NUMBER IS NOT NULL

Если вы хотите добавить это к текущему значению FULL_ADDRESS, как я понимаю из исходного вопроса,

UPDATE Network_Plant_Items
    SET FULL_ADDRESS = FULL_ADDRESS || COALESCE(BARCODE, MANUF_SERIAL_NUMBER)
    WHERE BARCODE IS NOT NULL OR MANUF_SERIAL_NUMBER IS NOT NULL

COALESCE() возвращает первый ненулевой аргумент, который вы передаете ему. См. Справочную страницу Oracle .

Так же, как и общий FIY, NVM(), который был предложен другими ответами, является старой специфической для Oracle версией COALESCE(), которая работает примерно так же, но поддерживает только два аргумента и оценивает второй аргумент, даже если первый из них не нулевой (или, другими словами, он не оценивается как короткое замыкание). Как правило, этого следует избегать, и вместо него следует использовать стандарт COALESCE, если только вам явно не нужно оценивать все аргументы, даже если в этом нет необходимости.

0 голосов
/ 06 сентября 2011

У меня не установлен Oracle, поэтому нельзя тестировать запрос, но это должно работать ....

Вы можете использовать функцию NVL, но она подходит для 2 вариантов (используйте значение a, если это не так).null, и если это так, используйте значение b)

update myTable
set myCol = NVL(colA,colB)

Поскольку вы, тем не менее, хотите объединить, если и только если вы получаете ненулевое значение из любого столбца, вам нужно немного сложнее и комбинироватьиспользование вложенного NVL ()

update myTable
set myCol = myCol || CASE NVL(NVL(colA,colB),0) WHEN 0 THEN '' ELSE '-' || NVL(colA,colB)

Объяснение:

  • NVL (colA, colB) сначала оценивает colA, colB, если colA равно нулю, и ноль, если оба равны нулю
  • Во всех ситуациях я возвращаю значение столбца
  • Затем добавляю - если оба значения равны NULL, я, по сути, добавляю 2 пустые строки ('' и NULL);в противном случае я добавляю '-', и значение, которое я оцениваю, равно
  • . Я использую оператор CASE, чтобы выполнить IF .. ELSE, чтобы вычислить, если мне нужно '-'
  • Я использую вложенныйФункции NVL присваивают 0, если оба значения равны нулю, чтобы сделать логику CASE простой
  • Затем я добавляю свое оценочное значение

Как я уже говорил, это не проверено, поэтому могут быть некоторыесинтаксис проблемы, но логика верна: -)

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