0

我有以下查询:

 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 (select listagg(udfo,',') within group(ORDER BY udfo) from XXXXX where pf_ticker is null )

相当于: ix.UDBENCH_UDIDX IN ('blal','bll',blc') 但它显示 ix.UDBENCH_UDIDX IN (blal,bll,blc) 并且我的查询结果是一个空表,你知道如何设置listagg 有这个结果('blal','bll',blc' 而不是 blal,bll,blc)?谢谢

4

1 回答 1

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 相同。如果您要生成一个稍后运行的语句,那么这可能是有道理的,但这里不是这样。

于 2017-02-20T17:28:17.903 回答