查找值是否存在于第二列中的任何位置并 return 结果

Find if a value exists anywhere in a second column and return a result

我需要将一列数据与另一列数据匹配,如果第一列存在于第二列中的任何位置,则结果应为“0.5”(1/2),否则如果不匹配或交叉两列结果应为“0”(零)。

我有 table,其中包含以下数据:

Job_Id   link_Id   
2         3
3         2
4         5
5         4
6         null
7         8
8         7
10        null

预期结果:

Job_Id  link_Id  cycle
2         3        0.5
3         2        0.5
4         5        0.5
5         4        0.5
6         null     0
7         8        0.5
8         7        0.5
10        null     0

我的查询:

select t.job_id
     , t.link_id
     , round((case when t.link_job_id IS NULL then 1 else null end))/2 cycles 
   from T_QCMS_JOB_STATE_HIS t

这不太行

您的 table 看起来可能是分层的,在这种情况下 recursive CTE/sub-query factoring clause 可能会在将来帮助您。

要获得当前结果,您只需要进行自连接:

select coalesce(l.job_id, j.job_id) as job_id
     , l.link_id
     , case when l.link_id is not null then 0.5 else 0 end as cycle
  from t_qcms_job_state_his j
  left outer join t_qcms_job_state_his l
    on j.job_id = l.link_id;

    JOB_ID    LINK_ID      CYCLE
---------- ---------- ----------
         2          3         .5
         3          2         .5
         4          5         .5
         5          4         .5
         7          8         .5
         8          7         .5
        10                     0
         6                     0

8 rows selected.

外连接用于处理并非所有 link ID 都存在的事实。

另一种不符合 ANSI 标准但只涉及单个 table 扫描的方法是使用 Oracle 的 FIRST 函数,这明显更令人困惑但效率更高:

with the_data as(
select job_id
     , max(link_id) keep (dense_rank first order by case when job_id = link_id then 0 else 1 end) as link_id
  from t_qcms_job_state_his
 group by job_id
       )
select job_id
     , link_id
     , case when link_id is not null then 0.5 else 0 end as cycle
  from the_data

为所需的输出使用超前和滞后函数

    SELECT job_id
    ,link_id
    ,nvl(CASE 
        WHEN lead(job_id) OVER (
                ORDER BY job_id
                ) = link_id
            AND lead(link_id) OVER (
                ORDER BY job_id
                ) = job_id
            OR lag(job_id) OVER (
                ORDER BY job_id
                ) = link_id
            AND lag(link_id) OVER (
                ORDER BY job_id
                ) = job_id
            THEN 0.5
        END,0) status1
FROM Table1

为什么不只是标准的外部联接?

select a.job_id, b.link_id, case when b.link is not null then 0.5 else 0 end cycle
from tb a left outer join tb b
on a.job_id = b.link_id;

由于没有创建 table 并且提供了数据,所以是徒手编写的。根据需要采用。