2017-02-20 7 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; 

: 그룹 (udfo BY ORDER 내

및 ix.UDBENCH_UDIDX IN (, udfo (listagg를 선택합니다 ',')) pf_ticker)에 상당

널 XXXXX에서 : ix.UDBENCH_UDIDX IN ('blal', 'BLL'역광 ') 그러나 ix.UDBENCH_UDIDX IN (blal, BLL, BLC) 및 결과를 나타낸다 내 검색어의 빈 테이블,이 결과 ('blal', 'bll', blc 대신 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') 

을하지만 당신은 문자열 리터럴이없는, 같은 것이 아닙니다. 쿼리 내에서 열 값을 작은 따옴표로 묶을 필요는 없으며 작은 값으로 묶지 않아도됩니다. 작은 따옴표는 문자열로 취급 될 리터럴 값을 나타냅니다. 열의 값은 이고 이미 문자열입니다.

당신은 실제로 당신이 무엇을 요구 할 수있는 경우, 널 (null)과 동일 테이블 (또는 빈 문자열에서 당신에게 인용 값의 쉼표로 구분 된 목록을 줄 것이다

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

일치하는 행이 없습니다. 나중에 실행할 문을 생성했다면 이해할 수 있지만 실제로는 그렇지 않습니다.

+0

감사합니다. 이미 첫 번째 아이디어를 시도했지만이 쿼리를 사용하기 때문에 작동하지 않습니다. 스트로커 절차에서. jon으로 어떻게 할 수 있는지 말해 줄 수 있니? –

+0

@ ProuProuTyu - "작동하지 않는다"는 것은 무슨 뜻입니까? 어떻게됩니까? tored procedure - 문을 생성 한 다음 동적으로 실행하고 있습니까? 'execute immediate'을 통해? 그렇다면 왜? (또한, 이전 타입 조인', XXXXX m'은 하위 쿼리와 동일한 * 테이블이며, 왜'ix' 또는'i'와 상관이 없는지?) –