ホーム › フォーラム › A5:SQL Mk-2掲示板 › OracleのNVARCHAR2列をLISTAGGで連結すると空白が表示される
- このトピックには3件の返信、1人の参加者があり、最後に
radianにより2年、 2ヶ月前に更新されました。
-
投稿者投稿
-
radian
ゲストお世話になっております。
タイトルのように、NVARCHAR2列からLISTAGGで連結した結果を取得すると、
文字列が空白が表示されるという現象が発生しました。
実際にテスト用に使用したテーブルデータとSQLを載せておきます。【CreateTable+insert文】
CREATE TABLE TEST1(
P_ID VARCHAR2(5)
,F_NAME VARCHAR2(5)
,W_NAME VARCHAR2(5)
,UPD_DAY DATE
);
CREATE TABLE TEST2(
P_ID VARCHAR2(5)
,F_NAME NVARCHAR2(5)
,W_NAME NVARCHAR2(5)
,UPD_DAY DATE
);
INSERT ALL
INTO TEST1 values (‘PID1′,’FNM11′,’WNM11’, to_date(‘2023/01/01’, ‘YYYY/MM/DD’))
INTO TEST1 values (‘PID1′,’FNM12′,’WNM12’, to_date(‘2023/01/02’, ‘YYYY/MM/DD’))
INTO TEST1 values (‘PID1′,’FNM13′,’WNM13’, to_date(‘2023/02/03’, ‘YYYY/MM/DD’))
INTO TEST1 values (‘PID2′,’FNM21′,’WNM21’, to_date(‘2023/03/01’, ‘YYYY/MM/DD’))
INTO TEST1 values (‘PID2′,’FNM22′,’WNM22’, to_date(‘2023/04/02’, ‘YYYY/MM/DD’))
INTO TEST1 values (‘PID2′,’FNM23′,’WNM23’, to_date(‘2023/04/03’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID1′,’FNM11′,’WNM11’, to_date(‘2023/01/01’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID1′,’FNM12′,’WNM12’, to_date(‘2023/01/02’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID1′,’FNM13′,’WNM13’, to_date(‘2023/02/03’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID2′,’FNM21′,’WNM21’, to_date(‘2023/03/01’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID2′,’FNM22′,’WNM22’, to_date(‘2023/04/02’, ‘YYYY/MM/DD’))
INTO TEST2 values (‘PID2′,’FNM23′,’WNM23’, to_date(‘2023/04/03’, ‘YYYY/MM/DD’))
SELECT * FROM DUAL;【SELECT文】
SELECT
P_ID
, LISTAGG(F_NAME, ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS NAME1
, LISTAGG(W_NAME, ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS NAME2
, LISTAGG(TO_CHAR(UPD_DAY, ‘YYYYMM’), ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS UPD_MONTH
FROM TEST1
GROUP BY P_ID
ORDER BY P_ID;SELECT
P_ID
, LISTAGG(F_NAME, ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS NAME1
, LISTAGG(W_NAME, ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS NAME2
, LISTAGG(TO_CHAR(UPD_DAY, ‘YYYYMM’), ‘,’) WITHIN GROUP (order by UPD_DAY DESC) AS UPD_MONTH
FROM TEST2
GROUP BY P_ID
ORDER BY P_ID;【TEST1のSELECTの取得結果】
P_ID NAME1 NAME2 UPD_MONTH
PID1 FNM13,FNM12,FNM11 WNM13,WNM12,WNM11 202302,202301,202301
PID2 FNM23,FNM22,FNM21 WNM23,WNM22,WNM21 202304,202304,202303【TEST2のSELECTの取得結果】
P_ID NAME1 NAME2 UPD_MONTH
PID1 202302,202301,202301
PID2 202304,202304,202303TEST1とTEST2で同じデータを表示しているのに、TEST2から取得した場合は空白になります。
なお、VB.NET + Oracle.ManagedDataAccess v21.9.0 で取得してみたところ、そちらでは特に問題は発生しませんでした。A5 version 2.18.0 beta 47
DB Oracle 11.2.0.1.0 64bitradian
ゲスト接続方法、アーキテクチャの記載を忘れていました。
接続方法:直接接続、OCI接続(Oracle Instant Client 18.3)
アーキテクチャ:x86松原正和
キーマスターradian さんこんにちは。
再現しようとしたのですが、再現できませんでした。(Oracle 19c 19.0.0.0.0)
アーキテクチャが x86 とのことですが、x64ではいかがでしょうか?
また、Version 2.18.0 のベータ版はいかがでしょうか?radian
ゲストVB.NET + Oracle.ManagedDataAccessでは問題が発生しないと思っていましたが、ひらがなをデータに含めた所、表示結果がおかしくなっていました。
こちらでも調査を行っているのですが、どうもOracle12以下の特定の?バージョンとNVARCHAR+LISTAGGの組み合わせで、問題の発生する事例があり、それを踏んでしまったかのかもしれません…
URL貼ると書き込めないようなので、
yahoo知恵袋の q11187532881
stackoverflow の 52078856/oracle-sql-listagg-not-returning-expected-result
辺りが該当しそうな感じですLISTAGGする前に、CASTやTO_CHARで解決している例もあるようなので実際に試したところ、
A5でも表示されるようになりましたので、ひとまず今回はこの方法で回避して自己解決とします。
お手数かけました。 -
投稿者投稿