首页 > 解决方案 > SQL - 加入条件 CASE - 如何制作 - 如果满足条件,则停止满足下一个条件

问题描述

收银员可以向字段 C40_DATA 输入 3 个不同的值(9962**********、id_invoice、web_order)

我想要的结果是:

  1. 如果来自 C40_DATA 的 substr 包含 p.id_invoice => 显示这些行
  2. 如果 C40_contains 包含 id_web_order 或 id_incvoice => 显示这些行 -> 这意味着点 1 始终显示,但点 2 -> 不显示两者,如果存在 id_web_order,则显示并停止,如果不存在,则查找 id_incvoice

当我创建这个(如下)时,结果包含所有 3 个,但我需要 1 +(如果存在 2,如果不存在 3)

select * from web_data p
inner join POS_DATA re on
   (case 
      when substr(re.C40_DATA,5,8) = p.id_invoice and substr(re.C40_DATA,1,4) ='9962' then 1 else
       (case 
          when re.C40_DATA = p.id_web_order and p.d_mnozstvi < '0' then 1 else
           (case 
              when re.C40_DATA = p.id_invoice and p.d_mnozstvi < '0' then 1 else 0 END)
        END)
        END=1)

您能否帮助如何在 JOIN 中进行 contitions - 如果满足一个条件,则停止并且找不到下一个条件?

谢谢,

标签: sql

解决方案


您尝试的查询会以这种方式更好地编写:

select * from web_data p
    inner join POS_DATA re on
            substr(re.C40_DATA, 5, 8) = p.id_invoice and substr(re.C40_DATA, 1, 4) = '9962'            
        or  re.C40_DATA = p.id_web_order and p.d_mnozstvi < '0'
        or  re.C40_DATA = p.id_invoice   and p.d_mnozstvi < '0'

如果您真的需要将其作为case表达式执行,则可以按如下方式完成。案件按顺序排列:

case
    when substr(re.C40_DATA, 5, 8) = p.id_invoice and substr(re.C40_DATA, 1, 4) ='9962' then 1
    when re.C40_DATA = p.id_web_order and p.d_mnozstvi < '0' then 1
    when re.C40_DATA = p.id_invoice   and p.d_mnozstvi < '0' then 1
end = 1

至于只匹配一个条件,我认为你想要这样的东西:

with data as (
    select *,
        case
            when re.C40_DATA = '9962' + p.id_invoice then 1
            when re.C40_DATA = p.id_web_order and p.d_mnozstvi < '0' then 2
            when re.C40_DATA = p.id_invoice   and p.d_mnozstvi < '0' then 3
        end as match_rank,
        min(case
            when re.C40_DATA = '9962' + p.id_invoice then 1
            when re.C40_DATA = p.id_web_order and p.d_mnozstvi < '0' then 2 
            when re.C40_DATA = p.id_invoice   and p.d_mnozstvi < '0' then 3
        ) over (partition by p.id_invoice, p.web_order) as min_match_rank
    from web_data p
        inner join POS_DATA re on
                re.C40_DATA = '9962' + p.id_invoice
            or  re.C40_DATA = (p.id_web_order, p.id_invoice) and p.d_mnozstvi < '0'

)
select * from data where match_rank = min_match_rank;

我冒昧地重写了您的一些条件,以防这些选项对您有用。另外,我不确定 < '0'应该是什么意思。最后,我不确定要划分哪些值,因为我不了解 和 之间的id_invoice关系id_web_order


推荐阅读