2011-09-06 109 views
0

我需要编写一个SQL查询,以从两列数据中的一个(基于哪个数据可用且不为空)中获取数据并将其附加到将静态文本转换为同一个表中的另一列。基于表中其他列数据的SQL查询更新

有人可以告诉我如何写这个?

示例数据:

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 

最终数据REQD在格式

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:

非常感谢Marco对您的帮助....位置字段只需在将同一表中的条形码/序列号附加到位置字段后更新。您编辑查询不工作:(...请让我知道如果我需要提供一些更多的信息/数据

最后更新:

Shesek的答复工作完美:d ...你是男人:)...由于一吨:d

回答

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

正如其他答案所建议的一般FIY NVM()COALESCE()旧的Oracle特定版本,其工作原理相同 - 但它只支持两个参数并评估第二个参数,即使第一个参数是非零(或换句话说,不是短路评估)。一般来说,应该避免使用它,而应该使用标准COALESCE,除非明确需要评估所有参数,即使不需要它们。

+0

谢谢谢塞克....完美地工作:D – Supra

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 
+2

@Supra:请不要将**代码块放入评论中 - 它们**非常难**阅读.....而是:**通过编辑**更新您的原始问题**提供更多信息! –

+0

@Supra:看看我编辑的代码。我没有Oracle,所以我无法测试查询... – Marco

+0

非常感谢Marco的帮助....位置字段只需在表格中添加条形码/序列号之后在表格中更新为位置字段。你编辑的查询不起作用:(...请让我知道,如果我需要给一些更多的信息/数据 – Supra

0

没有安装甲骨文,所以可以”吨测试查询,但这应该工作....

你可以使用NVL功能,但它是很好的2个选项

update myTable 
set myCol = NVL(colA,colB) 

既然你却想连接,当且仅(如果它不是空的,如果是,使用值b使用价值一)如果你从任一列非空值,则需要得到一点棘手和使用相结合嵌套NVL()

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

说明:

  • NVL(可乐,COLB)将评估为可口可乐第一,COLB如果可乐空,空,如果都为null
  • 在所有的情况下,我返回列的值
  • 我再追加 - 如果两者都为空,我基本上是附加了2个空字符串(''和NULL);否则,我正在追加' - ',并且我评估的值为
  • 我使用CASE语句来执行IF .. ELSE来计算是否需要' - '
  • 我使用嵌套的NVL函数来分配0两者都是空的情况下作出逻辑容易
  • 然后我附上我的评估值

正如我以前说过,这是未经测试,所以可能会有一些语法问题,但逻辑是正确的:-)

+0

查找其中一个不为空的行是否更容易? – shesek