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 В (ВЫБРАТЬ listagg (udfo, '') внутри группы (ORDER BY udfo) от ХХХХХ, где pf_ticker равно нулю)

Эквивалент: ix.UDBENCH_UDIDX IN ('blal', 'УСК', BLC '), но это показывает ix.UDBENCH_UDIDX IN (blal, BLL, BLC) и результат моего запроса пустой стол, вы знаете, как установить listagg для получения этого результата ('blal', 'bll', blc 'вместо blal, bll, blc)? Thanks

ответ

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 ... 

, который даст вам список разделенных запятыми котируемых значений из таблицы (или пустая строка, которая является такой же, как нуль, если есть Нет соответствующих строк. Если вы создавали оператор для запуска позже, это может иметь смысл, но это не так.

+0

Спасибо, что я уже пробовал вашу первую идею, но она не работает, поскольку я использую этот запрос в процедуре стропоскопа. Можете ли вы рассказать мне, как это сделать с jon, пожалуйста? –

+0

@ProuProuTyu - что значит «не работает» означает - что происходит? Что вы имеете в виду о s обработанная процедура - вы генерируете инструкцию, а затем запускаете ее динамически, например. через 'выполнить немедленный'? Если да, то почему? (Кроме того, что такое объединение старого типа, XXXXX m' doing - это то же самое * таблица, что и ваш подзапрос, и почему он не коррелирует с 'ix' или' i'?)? –