如何获得''对于listagg中的每个字符串?

时间:2017-02-20 17:25:26

标签: 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.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;

我想要的部分:

  

AND ix.UDBENCH_UDIDX IN(在组内选择listagg(udfo,&#39;,&#39;)(ORDER)   通过udfo)                                  来自XXXXX,其中pf_ticker为空)

相当于:ix.UDBENCH_UDIDX IN(&#39; blal&#39;,&#39; bll&#39;,blc&#39;)但它显示了ix.UDBENCH_UDIDX IN(blal,bll,blc)和我的查询结果是一个空表,你知道如何设置listagg来得到这个结果(&#39; blal&#39;,&#39; bll&#39;,blc&#39;而不是blal,bll,blc )? 感谢

1 个答案:

答案 0 :(得分: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相同。如果您生成的语句稍后运行,那么可能有道理,但这不是这里的情况。