是否可以根据以前的列案例选择列

时间:2014-12-11 12:34:32

标签: sql sql-server-2008 tsql

我需要根据邮政邮政编码将客户分为3组。

在客户数据库中,有2个字段可以包含邮政编码。

街道地址Zip是主要的,如果用户没有为街道地址输入Zip,则使用邮政地址。

有时两者都是NULL,并且可能输入了非法值。

所以我首先需要使用Case语句来获取ZIP:

情况下 当streetAddress.zip不为NULL且streetAddress.zip介于'0'和'99999'之间时,则为streetAddress.zip 当postalAddress.zip不是NULL而postalAddress.zip在'0'和'99999'之间时postalAddress.zip 否则NULL结束 ) '邮编',

但现在我想在下一栏中根据'PostCode'进行选择,但似乎无法使用上一栏中的值。

有点像 案件 当PostCode介于'00000'和'33333'之间时,则'Zone1' 当PostCode介于'33334'和'66666'之间,然后'Zone2' 当PostCode介于'66669'和'99999'之间,然后'Zone3' 端

最后,我试图制作一个视图,然后保留PostCode和Zone值。

3 个答案:

答案 0 :(得分:0)

为什么不使用子查询?

select . . .
from (select c.*,
             (case when streetAddress.zip IS not NULL and streetAddress.zip between '0' and '99999'
                   then streetAddress.zip
                   when postalAddress.zip IS not NULL and postalAddress.zip between '0' and '99999'
                   then postalAddress.zip
                   else NULL
              end) as PostCode
      from . . .
     ) c

您可以使用外部PostCode中的select列。

答案 1 :(得分:0)

如果你想在一个查询中使用它,你必须重复第一个案例中的所有代码,但你可以使用CTE选择第一个案例的所有数据,然后选择所有数据并应用第二个案例。

答案 2 :(得分:0)

如果你想在一个查询中的所有内容尝试重用case语句和sql如下所示 或者您可以使用SubQuery

select 
(case 
    when streetAddress.zip IS not NULL and streetAddress.zip between '0' and '99999' then streetAddress.zip 
    when streetAddress.zip IS NULL and postalAddress.zip IS not NULL and postalAddress.zip between '0' and '99999' then postalAddress.zip 
    else NULL 
 end ) AS [PostCode],
 (case 
    when streetAddress.zip IS not NULL and streetAddress.zip between '0' and '99999' then 
    <GroupA: Your Logic to get the column based on the value 'streetAddress.zip'>
    when streetAddress.zip IS NULL and postalAddress.zip IS not NULL and postalAddress.zip between '0' and '99999' then
    <GroupB: Your Logic to get the column based on the value 'postalAddress.zip'>
    else <GroupC:>
 end ) AS [PostCodeDependentColumn]
 From ....