"cased" where, multiple values for one 当

"cased" where, multiple values for one when

抱歉,如果标题很奇怪,我想不出更好的标题来解释情况。 "WHERE/CASE" 部分查询,截至目前:

where CO_SEGMENT LIKE case (outsideVar)
    when 9999 then '%'
    when 9001 then '9002' --9013, 9014, 9015
    when 9003 then '901[345]'
    when 9004 then '900[56]'
    when 9007 then '900[89]'
    else (outsideVar)
end

我的想法是,我有一个产品列表,以及一个将产品分组的细分列表。我的问题是某些细分市场,因为我需要他们列出来自 "like-conflicted" 个细分市场的产品。

从上面的例子来看,细分市场 9001 包含细分市场 9002 和 9003 - 但 9003 是 'fake segment',他包含细分市场 9013 到 9015。我不能输入 90[01][2345],因为它会包含产品来自列表中的段 9005,不属于那里...

提示?

PS:我只能在星期一看到这个,祝大家新年快乐!

尝试使用 CTE map table 而不是 CASE 的 SQL 模式:

;with
map as (
  select * from (values
     (9999, '%')
    ,(9001, '9002')
    ,(9003, '901[345]')
    ,(9004, '900[56]')
    ,(9007, '900[89]')
  )t(segment pattern)
),
patterns as (
  select
     data.key
    ,pattern = coalesce(map.pattern,data.outsideVar)
  from dataTable as data
  left join map on map.segment = data.outsideVar)
)
select * 
from dataTable as data
join patterns on data.CO_SEGMENT like patterns.pattern

有两种不同的使用方式CASE,请尝试另一种方式。

WHERE CASE
    WHEN outsideVar = 9999 THEN CO_SEGMENT LIKE '%'
    WHEN outsideVar = 9002 THEN (CO_SEGMENT LIKE '9002' OR CO_SEGMENT LIKE '901[345]')
    WHEN outsideVar = 9003 THEN CO_SEGMENT LIKE '901[345]'
    WHEN outsideVar = 9004 THEN CO_SEGMENT LIKE '900[56]'
    WHEN outsideVar = 9007 THEN CO_SEGMENT LIKE '900[89]'
    ELSE CO_SEGMENT LIKE outsideVar
    END