Oracle 如何为listagg中的每个字符串获取“”?

Oracle 如何为listagg中的每个字符串获取“”?,oracle,listagg,Oracle,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

我有以下疑问:

 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;
我想要的部分是:

以及groupORDER中select listagg udfo','中的ix.UDBENCH_UDIDX udfo 从XXXXX开始,其中pf_ticker为空

相当于:ix.UDBENCH_UDIDX在'blal','bll',blc'中,但它在blal,bll,blc中显示ix.UDBENCH_UDIDX,并且我的查询结果是一个空表,您知道如何设置listagg使此结果为'blal','bll',blc'而不是blal,bll,blc吗? 谢谢

IN操作员不是那样工作的。将UDBENCH_UDIDX值与包含所有udfo值(而不是该列的所有单个值)的单个字符串进行比较

您可以只使用不带listagg的子查询:

或者您可以连接到该表,而不使用任何子查询;比如:

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;
IN ('val1', 'val2', 'val3')
但是您没有字符串文字,您有来自表的字符串值,它们是不同的。您不需要也不应该在查询中用单引号括起这些列值。单引号表示要作为字符串处理的文本值;列中的值已经是字符串

你可以按你的要求去做:

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

这将为您提供一个以逗号分隔的表中引用值列表,或者一个空字符串,如果没有匹配的行,则与null相同。如果您要生成一个稍后运行的语句,那么这可能会有一定的意义,但这里不是这样。

谢谢,我已经尝试了您的第一个想法,但它不起作用,因为我在strore过程中使用了此查询。你能告诉我如何使用乔恩吗?@ProuProuTyu-什么不起作用意味着什么-会发生什么?关于存储过程,您的意思是什么?您是否生成一条语句,然后动态地运行它,例如通过executeimmediate?若然,原因为何?另外,旧类型join,XXXXX m在做什么?它与子查询是同一个表吗?为什么它没有与ix或i关联?
select '''' || listagg(udfo, ''',''') within group (order by udfo) || '''' from ...