SQL Server连接多个选择

问题描述 投票:0回答:2

我有以下声明:

Select No, Region = 'Ohio'
FROM table
where PostCode >='0001'
AND PostCode <= '4999'

它会在字段Region中使用正确的状态更新表。如何在同一语句中使用其他几个WHERE条件扩展该语句?

EG

Region = 'NewYork'
Where PostCode >='5000'
AND PostCode <= '7999'

我的解决方案是为每个区域建立几个语句,但必须有更好的方法将它们合二为一。

sql sql-server select
2个回答
1
投票

在单个查询中基于多个条件选择/设置不同值的两种常用方法是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中的特定行返回任何内容。


0
投票

您可以使用区域上的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
© www.soinside.com 2019 - 2024. All rights reserved.