A5:SQL Mk-2

開発のこと、日々のこと

OracleのNVARCHAR2列をLISTAGGで連結すると空白が表示される

ホーム フォーラム A5:SQL Mk-2掲示板 OracleのNVARCHAR2列をLISTAGGで連結すると空白が表示される

  • このトピックには3件の返信、1人の参加者があり、最後にradianにより1年、 2ヶ月前に更新されました。
4件の投稿を表示中 - 1 - 4件目 (全4件中)
  • 投稿者
    投稿
  • #19567 返信
    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,202303

    TEST1とTEST2で同じデータを表示しているのに、TEST2から取得した場合は空白になります。
    なお、VB.NET + Oracle.ManagedDataAccess v21.9.0 で取得してみたところ、そちらでは特に問題は発生しませんでした。

    A5 version 2.18.0 beta 47
    DB Oracle 11.2.0.1.0 64bit

    #19568 返信
    radian
    ゲスト

    接続方法、アーキテクチャの記載を忘れていました。
    接続方法:直接接続、OCI接続(Oracle Instant Client 18.3)
    アーキテクチャ:x86

    #19667 返信
    松原正和
    キーマスター

    radian さんこんにちは。
     
    再現しようとしたのですが、再現できませんでした。(Oracle 19c 19.0.0.0.0)
    アーキテクチャが x86 とのことですが、x64ではいかがでしょうか?
    また、Version 2.18.0 のベータ版はいかがでしょうか?

    #19679 返信
    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でも表示されるようになりましたので、ひとまず今回はこの方法で回避して自己解決とします。
    お手数かけました。

4件の投稿を表示中 - 1 - 4件目 (全4件中)
返信先: OracleのNVARCHAR2列をLISTAGGで連結すると空白が表示される
あなたの情報:




コメントは受け付けていません。