按条件连接列(oracle)

Concatenate column by condition (oracle)

source_id source_groupid source_nm category_id level_id
12345 34 ABC 7 2
67549 GI 5 1
24751 BL 6

结果

{"id": 12345, "groupid": 34, "name": ABC, "category_id": 7, "level_id": 2}
{"id": 67549, "groupid": , "name": GI, "category_id": 5, "level_id": 1}

SELECT CONCAT ('{','"id": ', source_id,', ', '"groupid": ', source_groupid,', ','"name": ',source_nm,', ','"category_id": ',category_id,', ', '"level_id": ', level_id, '}') as full_info
FROM table

我需要根据以下模式进行列连接。例如,如果 group_id 或 category_id 中没有条目,那么如何编写代码以使模板更改并查找第 2 行和第 3 行,如下所示。

{"id": 12345, "groupid": 34, "name": ABC, "category_id": 7, "level_id": 2}
{"id": 67549, "name": GI, "category_id": 5, "level_id": 1}
{"id": 24751, "name": BL, "level_id": 6}

好吧,在 Oracle 中(您使用了哪个标记),CONCAT 函数只接受两个参数,因此 - 该代码将不起作用。

相反,请使用双管道 || 运算符。至于你的 main 问题,CASE 是。

SQL> with test (source_id, source_groupid, source_nm, category_id, level_id) as
  2    (select 12345,   34, 'ABC', 7,    2    from dual union all
  3     select 67549, null, 'GI' , 5,    1    from dual union all
  4     select 24751, null, 'BL' , null, 6  from dual
  5    )
  6  select '{' || '"id": ' || source_id ||
  7    case when source_groupid is not null then ', "groupid": '     || source_groupid end ||
  8    case when source_nm      is not null then ', "name": '        || source_nm      end ||
  9    case when category_id    is not null then ', "category_id": ' || category_id    end ||
 10    case when level_id       is not null then ', "level_id": '    || level_id       end || '}'
 11    as result
 12  from test;

RESULT
--------------------------------------------------------------------------------
{"id": 12345, "groupid": 34, "name": ABC, "category_id": 7, "level_id": 2}
{"id": 67549, "name": GI, "category_id": 5, "level_id": 1}
{"id": 24751, "name": BL, "level_id": 6}

SQL>

从 Oracle 12 开始,不要手动构建 JSON;使用 JSON_OBJECT 函数然后你可以使用 ABSENT ON NULL:

SELECT JSON_OBJECT(
         KEY 'id'          VALUE source_id,
         KEY 'groupid'     VALUE source_groupid,
         KEY 'name'        VALUE source_nm,
         KEY 'category_id' VALUE category_id,
         KEY 'level_id'    VALUE level_id
         ABSENT ON NULL
       ) As json
FROM   table_name;

其中,对于示例数据:

CREATE TABLE table_name (source_id, source_groupid, source_nm, category_id, level_id) AS
SELECT 12345, 34,   'ABC', 7,    2 FROM DUAL UNION ALL
SELECT 67549, NULL, 'GI',  5,    1 FROM DUAL UNION ALL
SELECT 24751, NULL, 'BL',  NULL, 6 FROM DUAL;

输出:

JSON
{"id":12345,"groupid":34,"name":"ABC","category_id":7,"level_id":2}
{"id":67549,"name":"GI","category_id":5,"level_id":1}
{"id":24751,"name":"BL","level_id":6}

db<>fiddle here