使用Field_A值根据同一字段上Field_A值的修改版本查找记录

时间:2017-05-11 06:44:55

标签: sql oracle

我有下表,我希望得到所需的结果集,基于:

  1. 用“TICKER”中的C1替换CS,用“TICKER”中的C2替换CG。
  2. 使用上方代码在同一张表中的TICKER字段中查找完全匹配。
  3. 如果匹配,则返回记录对。
  4. 现有表格:

    TICKER | EXCHANGE | COUNTRY
    -------+----------+--------
    123 CS | HKE      | HK      
    123 C1 | SGX      | SG
    124 CG | LSE      | GB
    124 C2 | NYE      | US
    125 CS | NAS      | US
    125 C1 | SGX      | SG
    126 C1 | KUL      | MY
    

    期望的结果集:

    TICKER | EXCHANGE | COUNTRY
    -------+----------+--------
    123 CS | HKE      | HK     
    123 C1 | SGX      | SG
    124 CG | LSE      | GB
    124 C2 | NYE      | US
    125 CS | NAS      | US
    125 C1 | SGX      | SG
    

    感谢您对如何使用“C1 / C2自动收录器”找到完全匹配的帮助,以便返回该对?

    谢谢

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用COUNT OVER

select ticker, exchange, country
from
(
    select
        ticker, exchange, country,
        count(*) over (partition by 
                       regexp_substr(ticker, '^[^ ]+'), 
                       case when ticker like '%C1' 
                              or ticker like '%CS' then 'C1' else 'C2' end
                      ) as cnt
    from tickers
    where ticker like '%C1'
       or ticker like '%C2' 
       or ticker like '%CG' 
       or ticker like '%CS' 
)
where cnt > 1
order by ticker;

内部WHERE子句可以用更优雅的

替换
regexp_like(ticker, '.*C[12GS]$')
顺便说一句,如果您愿意的话。

CASE表达式可以替换为

case when regexp_substr(ticker, '[^ ]+$') in ('C1', 'CS') then 'C1' else 'C2' end

case when regexp_like(ticker, '.*C[12]$') then 'C1' else 'C2' end

如评论中所述,您可能更愿意更改表格设计,例如将股票代码值分开。如果您不允许这样做,您仍然可以使用regexp_substr(ticker, '^[^ ]+')regexp_substr(ticker, '[^ ]+$')创建一个视图,并使用它来方便使用。