как получить "" для каждой строки в 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 (выберите listagg (udfo, ',') в группе (ORDER BY udfo) из XXXXX, где pf_ticker имеет значение null)

Эквивалентен: ix.UDBENCH_UDIDX IN ('blal', 'bll', blc '), но показывает ix.UDBENCH_UDIDX IN (blal, bll, blc), а результат моего запроса - пустая таблица, знаете ли вы, как установить listagg, чтобы получить этот результат ('blal', 'bll', blc 'вместо blal, bll, blc)? Спасибо


person Prou Prou Tyu    schedule 20.02.2017    source источник


Ответы (1)


Оператор 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, если нет совпадающих строк. Если вы генерировали оператор для запуска позже, то это может иметь некоторый смысл , но здесь дело обстоит не так.

person Alex Poole    schedule 20.02.2017
comment
Спасибо. Я уже попробовал вашу первую идею, но она не работает, поскольку я использую этот запрос в строгой процедуре. Подскажите, пожалуйста, как это сделать с джоном? - person Prou Prou Tyu; 20.02.2017
comment
@ProuProuTyu - что значит не работает - что происходит? Что вы имеете в виду о хранимой процедуре - вы создаете оператор, а затем запускаете его динамически, например через execute immediate? Если да, то почему? (Кроме того, что делает объединение старого типа , XXXXX m - это та же таблица, что и ваш подзапрос, и почему она не связана с ix или i?) - person Alex Poole; 20.02.2017