我需要编写一个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
答案 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 function和String 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)
说明:
正如我之前所说,这是未经测试的,因此可能存在一些语法问题,但逻辑是正确的: - )
答案 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
,除非您明确需要评估所有参数,即使不需要它也是如此。