【问题标题】:Is it possible to select column based on previous column case是否可以根据以前的列案例选择列
【发布时间】:2014-12-12 02:41:07
【问题描述】:

我需要根据他们的邮政编码将我的客户分成 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 介于“00000”和“33333”之间时,则为“Zone1” 当 PostCode 介于“33334”和“66666”之间时,则为“Zone2” 当 PostCode 介于“66669”和“99999”之间时,则为“Zone3” 结束

最后,我试图创建一个视图,然后保存 PostCode 和 Zone 值。

【问题讨论】:

  • COALESCE(AddressZip, PostalZip) ?
  • 旁注:您实际上想要创建一个表(可能还有一个关联的物化视图)来处理您的 zip->zone 范围转换。这使得更新变得微不足道(无需触摸进行转换的查询),甚至可以完全防止某些类型的配置错误(即重叠范围)。

标签: sql sql-server-2008 tsql


【解决方案1】:

为什么不只使用子查询?

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果你想要一个查询中的所有内容,请尝试重用 case 语句,sql 如下所示 或者你可以使用子查询

      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 ....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-12
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多