【问题标题】:"cased" where, multiple values for one when"cased" where,一个当多个值
【发布时间】:2015-12-30 21:17:40
【问题描述】:

对不起,如果标题很奇怪,我想不出一个更好的来解释这种情况。查询的“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],因为它会包含来自段 9005 的产品在名单上,不属于那里......

提示?

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

【问题讨论】:

  • 我假设您的数据库是 SQL Server。您应该正确标记它。

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


【解决方案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

【讨论】:

  • 谢谢!我会在星期一早上尝试第一件事,并告诉你它是否有效 - 但看起来它确实有效 =D
  • 不,不起作用。 SQL 抱怨第一个“喜欢”=(
  • SQL Fiddle 由于某种原因今天不适合我。可以尝试几件事:将第一个 LIKE 更改为 TRUE。我希望不会,但我们可能需要嵌套 CASE 语句,例如将 THEN CO_SEGMENT LIKE '901[345]' 更改为 THEN (CASE WHEN CO_SEGMENT LIKE '901[345]' THEN TRUE ELSE FALSE END)
  • 谢谢,但我最终从 CASE 更改为 boolean =)
【解决方案2】:

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

【讨论】:

  • 这是很好的信息,但不能解决问题。 OP 的代码有效,但段需要 9002 包括段 9003(包括 9013、9014 和 9015)。最初的尝试是 LIKE '90[01][2345]',但它给出了不应包含的 9005(以及其他)。
猜你喜欢
  • 2014-04-11
  • 2020-07-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多