![](/img/trans.png)
[英]SQL Query to update a column based on the values of other columns in the same table
[英]SQL Query for an update of a column based on other column's data in a Table
我需要编写一个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
最终数据格式要求
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的帮助。...仅在将同一表的条形码/序列号附加到location字段后,才需要更新table中的location字段。 您编辑的查询无效:(...请让我知道是否需要提供更多信息/数据。
最终更新:
谢谢克的答案很完美:D ...你是男人:)...谢谢
尝试这个:
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
没有安装Oracle,因此无法测试查询,但这应该可以工作。
您可以使用NVL函数,但这对2个选项很有用(如果不为null,则使用值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)
说明:
如我之前所说,这未经测试,因此可能存在一些语法问题,但逻辑是正确的:-)
根据您对其他答案的评论,
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的手册页 。
就像一般的FIY一样,另一个答案建议的NVM()
是旧的Oracle特定版本的COALESCE()
,它的工作原理大致相同-但它仅支持两个参数,并且即使第一个参数是非空(或换句话说,未评估短路)。 通常,应该避免使用标准COALESCE
应该使用标准COALESCE
,除非您明确需要评估所有参数,即使在不需要时也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.