对于以下 sql 查询,Oracle 中 STRING_AGG 的 SQL 等价物是什么

问题描述 投票:0回答:1

以下 SQL 代码在 SAP HANA 中运行良好。

CREATE OR replace VIEW VIEW_RADTEST_CLICK_TODAY AS
SELECT 
        ROW_NUMBER() OVER() AS row_num,
        v1.*
FROM 
(
SELECT  v.consult_date,
        v.PATIENT_EMPLOYEE_ID,
        v.PATIENT_KWT_NKWT,
        v.PATIENT_NAME,
        v.DEPARTMENT_ID,
        v.DEPARTMENT_NAME,
        v.DOCTORS_ID,
        v.DOCTOR_NAME,
        v.OFFICE_ID,
        v.OFFICE_NAME,
        count(cl.LABTEST_ID) AS "PATIENT_RADTEST_COUNT",
        STRING_AGG(CASE 
                        WHEN v.OFFICE_ID in(4,5,6,7,8)  THEN cl.LABTEST_ID 
                        ELSE 0
                    END,',') AS "LABTEST_ID",
        STRING_AGG(CASE 
                        WHEN v.OFFICE_ID in(4,5,6,7,8)  THEN ts.TEST_NAME 
                        ELSE 0
                    END,',') AS "TEST_NAME",
        STRING_AGG(CASE 
                        WHEN v.OFFICE_ID in(4,5,6,7,8)  THEN ts.CATEGORY_ID 
                        ELSE 0
                    END,',') AS "CATEGORY_ID",
        STRING_AGG(CASE 
                        WHEN v.OFFICE_ID in(4,5,6,7,8)  THEN tc.CATEGORY_NAME 
                        ELSE 0
                    END,',') AS "CATEGORY_NAME"
FROM ECLINIC_KNG.VIEW_DOCTOR_CONSULT_TODAY v
INNER JOIN ECLINIC_KNG.CONSULT_LABTEST cl
    on(v.CONSULT_ID=cl.CONSULT_ID)
INNER JOIN ECLINIC_KNG.TEST_SETUP ts
    on(cl.LABTEST_ID=ts.TEST_ID)
INNER JOIN ECLINIC_KNG.TEST_CATEGORY tc
     ON (ts.CATEGORY_ID=tc.CATEGORY_ID)
WHERE v.CONSULT_DATE BETWEEN CURRENT_DATE AND CURRENT_DATE
AND ts.ACTIVE_STATUS ='Y'
AND tc.ACTIVE_STATUS ='Y'
AND ts.LAB_TYPE IN('X','O')
GROUP BY 
        v.consult_date,
        v.PATIENT_EMPLOYEE_ID,
        v.PATIENT_KWT_NKWT,
        v.PATIENT_NAME,
        v.DEPARTMENT_ID,
        v.DEPARTMENT_NAME,
        v.DOCTORS_ID,
        v.DOCTOR_NAME,
        v.OFFICE_ID,
        v.OFFICE_NAME
ORDER BY v.OFFICE_NAME 
)AS v1;

问题是当我尝试将数据库从 SAP HANA 迁移到 Oracle SQL 时,STRING_AGG 函数将不起作用。在 Oracle 中,使用 LISTAGG 函数代替 STRING_AGG。 LISTAGG 在 SAP HANA 中对我不起作用。我想调整包含 STRING_AGG 的 SQL 代码部分及其替代等效项,使其同时满足 SAP HANA 和 Oracle。

sql oracle hana
1个回答
0
投票

我不了解 SAP HANA,但是 - 只是为了 warn 你 - 也许你不会像你希望的那样幸运。数据库供应商有 similar 返回相同结果的函数,但并非所有这些(函数)都是标准的。这就是您在

STRING_AGG
LISTAGG
上学到的。

另一个选项可能是

XMLAGG
;这是一个例子:

SQL> SELECT RTRIM (
  2            XMLAGG (XMLELEMENT (e, e.ename || ', ') ORDER BY e.ename).EXTRACT (
  3               '//text()'),
  4            ', ') AS result
  5    FROM emp e
  6   WHERE e.deptno = 10;

RESULT
--------------------------------------------------------------------------------
CLARK, KING, MILLER

正如我所说:我不了解 SAP HANA,所以这只是在 Oracle 中工作的另一种选择。看看有没有帮助。


(顺便提一下:低于 12c 的 Oracle 版本包含名为

WM_CONCAT
的未记录函数。我认为 SAP HANA 不知道它,但是 - 即使它知道 - 跳过该选项。功能甚至不存在于 12c 和更高版本。)


最后:用户自定义函数。如果没有其他帮助,请尝试编写您自己的函数,该函数simulates内置函数的功能,但其中包含可在 SAP HANA 和 Oracle 中编译的代码。不过,我希望它的表现比内置函数差

© www.soinside.com 2019 - 2024. All rights reserved.