2017-02-20 2 views
0

私は次のクエリがあります:私はパートをしたいと思いlistaggの各文字列の ''を取得する方法は?

SELECT 
    ix.dt AS DT, 
    ix.UDBENCH_UDIDX AS UDFO, 
    ' .' || REPLACE(REPLACE(ix.UDBENCH_UDIDX,' ',''),'IS','') AS PF_TICKER, 
    i.szbez AS PORTFOLIO_NAME, 
    ix.rm_generic_inst_type_l1, 
    ix.rm_generic_inst_type_l2, 
    ix.scd_sec_type, 
    m.ud_isin AS SECURITY_ID, 
    '%' AS POS_TYPE, 
    ix.sec_weight AS QUANTITY, 
    ix.sec_ccy, 
    ix.sec_price AS MKT_PRICE, 
    '' AS COST_PX, 
    '' AS POSITION_VALUE_AC, 
    '' AS POSITION_VALUE_FC, 
    m.ud_sedol AS UD_SEDOL, 
    m.ud_bbgid AS UD_ID_BB_UNIQUE, 
    m.ud_cusip AS UD_CUSIP, 
    m.ud_bbgid AS UD_BBGID, 
    m.inst_name AS INST_NAME, 
    ix.idas AS IDAS, 
    m.ud_scd_securityid AS UD_SCD_SECURITYID 
FROM XXXX ix 
INNER JOIN XXXXR i ON (i.udidx = ix.UDBENCH_UDIDX), 
    XXXXX m 
WHERE ix.dt >= to_date(sdt_start,'DD.MM.YYYY') 
AND ix.dt <= to_date(sdt_end,'DD.MM.YYYY') 
AND ix.UDBENCH_UDIDX IN (select listagg(udfo,',') within group(ORDER BY udfo) 
           from XXXXX where pf_ticker is null) 
AND i.szbez LIKE '%DFLT%' 
AND ix.idas = m.idas; 

を:

とix.UDBENCH_UDIDX IN( ''、udfo(LISTAGGを選択)グループ内(udfo BY ORDER )相当pf_tickerがnull XXXXXから )

:ix.UDBENCH_UDIDX IN( 'blal'、 'BLL'、BLC ')が、ix.UDBENCH_UDIDX IN(blal、BLL、BLC)及び結果を示し私の質問の空のテーブル、あなたはこの結果( 'blal'、 'bll'、blal、blal、bll、blcの代わりに)を持つようにlistaggを設定する方法を知っていますか? ありがとう

答えて

0

IN演算子はそのようには動作しません。 UDBENCH_UDIDXの値と、その列の個々の値のすべてではなく、すべてのudfoの値を含む単一の文字列とを比較します。

は、あなただけのlistagg()なしでサブクエリを使用することができます。

AND ix.UDBENCH_UDIDX IN (select udfo from XXXXX where pf_ticker is null) 

それとも、代わりに、すべてのサブクエリを使用してのそのテーブルに参加することができます。以下のようなもの:古いスタイルを想定し

FROM XXXX ix 
INNER JOIN XXXXR i ON (i.udidx = ix.UDBENCH_UDIDX) 
INNER JOIN XXXXX m ON (m.udfo = ix.UDBENCH_UDIDX) 
WHERE ix.dt >= to_date(sdt_start,'DD.MM.YYYY') 
AND ix.dt <= to_date(sdt_end,'DD.MM.YYYY') 
AND i.szbez LIKE '%DFLT%' 
AND ix.idas = m.idas 
AND m.pf_ticker is null; 

が... XXXXX mに参加するには、あなたがやっているサブクエリに関連するデータを取得することになっている - それは難読化された名前で伝えるのは難しいです。 (とにかく古いスタイルの結合と新しいスタイルの結合を混ぜたり、古いスタイルの結合を使用するのは良い考えではありません。それを外部結合や運転台などにすることもできますが、提供された情報からそれを推測することはできません。


すでに文字列リテラルのセットは、あなたのようなものだろうを探すために持っていた場合は、次の表から、あなたは文字列値を持つ、

IN ('val1', 'val2', 'val3') 

をいますが、文字列リテラルを持っていません、同じではありません。クエリー内でこれらの列の値を単一引用符で囲む必要はありません。一重引用符は、文字列として扱われるリテラル値を示します。列の値は、すでにの文字列です。

あなたが実際にあなたが求めて何ができる:

select '''' || listagg(udfo, ''',''') within group (order by udfo) || '''' from ... 

がある場合、あなたのテーブルから引用された値のカンマ区切りリスト(またはnullと同じである空の文字列を与えることになります一致する行がありません。後で実行する文を生成していれば、それは意味をなさつかもしれませんが、ここには該当しません。

+0

ありがとう私はすでに最初のアイデアを試みましたが、ストローラーの手順であなたに教えてもらえますか? –

+0

@ProuProuTyu - 「動作しません」とはどういう意味ですか?何が起こっているのですか?ステートメントを生成してからそれを動的に実行していますか? 'execute immediate'を介して?もしそうなら、なぜですか? (また、古い型の結合 '、XXXXX m'はあなたのサブクエリと同じ*テーブルで、なぜ' ix'や 'i'と相関しないのでしょうか?) –

関連する問題