SQL查询,用于根据表中其他列的数据更新列

时间:2011-09-06 06:44:39

标签: sql oracle

我需要编写一个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。

同前

更新1:

非常感谢Marco的帮助......在将相同表格中的条形码/序列号附加到位置字段后,位置字段只需要在表格中更新。您编辑的查询不起作用:(...如果我需要提供更多信息/数据,请告诉我。

最终更新:

Shesek的答案非常完美:D ......你是那个人:)...非常感谢:D

3 个答案:

答案 0 :(得分:1)

试试这个:

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 functionString Concat 我不确定我如何逃过序列号字段,无论如何看here

<强>编辑:
试试这个:

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

答案 1 :(得分:0)

没有安装Oracle,因此无法测试查询,但这应该有效....

你可以使用NVL功能,但它适用于2个选项(如果它不为空则使用值a,如果是,则使用值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,如果colA为null,则为colB;如果两者均为null,则为null
  • 在所有情况下,我都会返回列的值
  • 然后我追加 - 如果两者都是null,我基本上是附加2个空字符串(''和NULL);否则,我将附加' - '和我评估的值
  • 我使用CASE语句来做一个IF .. ELSE来计算我是否需要' - '
  • 如果两者都为空,我使用嵌套的NVL函数指定0以使CASE逻辑变得容易
  • 然后我追加我的评估值

正如我之前所说,这是未经测试的,因此可能存在一些语法问题,但逻辑是正确的: - )

答案 2 :(得分:0)

根据您对其他答案的评论,

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()返回传递给它的第一个非NULL参数。请参阅Oracle的manual page on it

正如一般的FIY,另一个答案所建议的NVM()是旧的Oracle特定版本的COALESCE(),它的工作方式相同 - 但它只支持两个参数并评估第二个参数即使第一个非空(或者换句话说,它不是短路评估)。通常,应该避免使用标准COALESCE,除非您明确需要评估所有参数,即使不需要它也是如此。