我有以下声明:
Select No, Region = 'Ohio'
FROM table
where PostCode >='0001'
AND PostCode <= '4999'
它会在字段Region中使用正确的状态更新表。如何在同一语句中使用其他几个WHERE条件扩展该语句?
EG
Region = 'NewYork'
Where PostCode >='5000'
AND PostCode <= '7999'
我的解决方案是为每个区域建立几个语句,但必须有更好的方法将它们合二为一。
在单个查询中基于多个条件选择/设置不同值的两种常用方法是case
语句,并在具有这些值的另一个表上执行join
。我还应该指出,你可以充分利用SQL服务器中的between
运算符。
单个查询中的CASE语句 如果您有一小组条件,或者只需要将特殊查询放在一起,则case语句可能很有用。以下是使用case语句的示例:
select
No,
Region = case
when (PostCode >= '0001' and PostCode <= '4999')
'Ohio'
when (PostCode between '5000' and '7999')
'NewYork'
else
'Unknown'
end
from [...]
使用值和条件加入表 这绝对是评估50个州的更好方法 - 特别是因为这些数据可能是静态的。我们的想法是,您希望拥有一个包含条件和值的表,然后将其连接到表中。
下面是一个使用临时表的示例 - 您可能希望使用真实表来表示常见的状态。
-- Setup a #states table
create table #states (state varchar(20), PostCodeMin char(4), PostCodeMax char(4))
insert into #states values ('Ohio', '0001', '4999')
insert into #states values ('NewYork', '5000', '7999')
-- Now query it
select
t.No,
State = isnull(s.state, 'Unknown')
from
my_table t
left outer join #states s
on (t.PostCode between s.PostCodeMin and s.PostCodeMax)
请注意,在上面的查询中,如果未设置状态,我会对#states执行左外连接。我还使用isnull
选择State,以防外连接不为my_table中的特定行返回任何内容。
您可以使用区域上的case语句创建计算字段。如果将返回许多“未知”记录,那么您可能需要调整WHERE子句以过滤掉不重要的记录以获得更好的性能。
SELECT
*
FROM
(
Select
No,
Region =
CASE
WHEN PostCode >'0001' AND PostCode <='4999' THEN 'Ohio'
WHEN PostCode >'5000' AND PostCode <='7999' THEN 'New York'
ELSE
'Unknown'
END
FROM table
where PostCode >='0001' AND PostCode <= '7999'
)AS X
ORDER BY
Region