我正在尝试使用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
有什么想法吗?有没有更好的方法来构建查询?
由于
答案 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)