SQL按编号区域和全局过滤国家/地区

时间:2013-09-30 21:06:25

标签: sql sql-server

我正在尝试使用Microsoft SQL服务器构建SQL查询,其中国家/地区可以按编号从0到4的区域进行过滤,0表示全局

我构建了一个查询,它正确地过滤了区域1到4,如下例所示,但如果选择0(作为全局)作为区域,我无法弄清楚如何获得所有国家/地区。

declare @region as integer
set @region = 1
select *
 from Country where 
 case LEFT(name,2) 
when 'US' THEN 1
when 'UK' THEN 2
WHEN 'DE' THEN 3
WHEN 'CZ' THEN 4
WHEN 'ES' THEN 4
WHEN 'FR' THEN 4
WHEN 'IT' THEN 4
WHEN 'NL' THEN 4
WHEN 'PL' THEN 4
WHEN 'RO' THEN 4
WHEN 'SE' THEN 4
END = @region

有什么想法吗?有没有更好的方法来构建查询?

由于

3 个答案:

答案 0 :(得分:2)

要在@region为0时返回所有国家/地区:

declare @region as integer
set @region = 1
select *
 from Country where 
    @region = 0
 OR
     case LEFT(name,2) 
        when 'US' THEN 1
        when 'UK' THEN 2
        WHEN 'DE' THEN 3
        WHEN 'CZ' THEN 4
        WHEN 'ES' THEN 4
        WHEN 'FR' THEN 4
        WHEN 'IT' THEN 4
        WHEN 'NL' THEN 4
        WHEN 'PL' THEN 4
        WHEN 'RO' THEN 4
        WHEN 'SE' THEN 4
    END = @region

此外,您可以将区域添加为国家/地区表中的列吗?这会让整件事变得更容易吗?

答案 1 :(得分:0)

select *
from Country 
where @region = 0 OR
(case LEFT(name,2) 
when 'US' THEN 1
when 'UK' THEN 2
WHEN 'DE' THEN 3
WHEN 'CZ' THEN 4
WHEN 'ES' THEN 4
WHEN 'FR' THEN 4
WHEN 'IT' THEN 4
WHEN 'NL' THEN 4
WHEN 'PL' THEN 4
WHEN 'RO' THEN 4
WHEN 'SE' THEN 4
END = @region)

是让它发挥作用的方法。但是,您应该拥有一个包含国家/地区名称和区域代码的查找表,而不是使用此硬编码的case语句。然后,您可以重写SQL语句以从该表中提取国家/地区代码并将其与区域进行比较

答案 2 :(得分:0)

您可以在国家/地区表中放置名为region的字段 然后把这个条件放在下面

   select * from Country where @region = 0 or Country.region =@region

你可以在你的代码中这样做

  select * from Country where @region = 0 OR (case LEFT(name,2) 
  when 'US' THEN 1
  when 'UK' THEN 2
  WHEN 'DE' THEN 3
  WHEN 'CZ' THEN 4
  WHEN 'ES' THEN 4
  WHEN 'FR' THEN 4
  WHEN 'IT' THEN 4
  WHEN 'NL' THEN 4
  WHEN 'PL' THEN 4
  WHEN 'RO' THEN 4
  WHEN 'SE' THEN 4
  END = @region)