我有以下查询:
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 )? 感谢
答案 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相同。如果您生成的语句稍后运行,那么可能有道理,但这不是这里的情况。