“套装”在哪里,多个值为一个时

时间:2015-12-30 21:17:40

标签: sql sql-server case where sql-like

对不起,如果标题很奇怪,我想不出一个更好的解释情况。查询的“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

这个想法是我有一个产品列表,以及一个分组产品列表。我的问题是针对某些细分市场,因为我需要他们列出“喜欢冲突”细分的产品。

从上面的例子中,段9001包含段9002和9003 - 但9003是'假段',他包含段9013到9015.我不能放90[01][2345]因为它包含来自段{{1}的产品列表上的{1}},不属于那里......

提示?

PS:我只能在星期一看到这个,所以今年很开心,伙计们!

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:0)

使用CTE map 表而不是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