sql在一个交叉应用/案例表达式中设置多个值

Posted

技术标签:

【中文标题】sql在一个交叉应用/案例表达式中设置多个值【英文标题】:sql setting mutiple values in one cross apply / case expression 【发布时间】:2018-06-10 23:35:23 【问题描述】:

我正在尝试清理下面的查询。在第一个交叉应用中,我评估[Store Number][Branch Number] 并返回[Store Name],然后在以下三个交叉应用中,我使用这个[Store Name] 分别返回[Phone Number][Contact Name][Contact Title]。有没有办法在一个额外的交叉应用/案例中设置和返回所有这三个值?

SELECT

       C.[Store Number]
       ,B.[Store Name]
       ,PH.[Phone Number]
      ,CN.[Contact Name]
      ,CT.[Contact Title]
  FROM [Central_Account] C 

      cross apply (select[Store Name] = case C.[Store Number]
                                 when 9146 then
                                    case
                                          when C.[Branch Number] In (14, 16, 18)
                                          then 'Community Store'
                                    end  
                                 when 8147 Then 
                                    case
                                          when C.[Branch Number] In (24, 26, 28)
                                          then 'City Store'
                                    end
                                 when 7148 Then 
                                   case
                                          when C.[Branch Number] In (34, 36, 38)
                                          then 'County Store'
                                   end
                                 else
                                    'State Store'
                           end )as B
        cross apply (select [Phone Number] = case B.[Store Name]
                       when 'Community Store' Then
                                      '414.882.8278'       
                                 when 'City Store' Then
                                      '221.332.6221'
                                 when 'County Store' Then
                                    '211.949.2008'
                                 else
                                    '635.588.1878'
                           end ) as PH                        
      cross apply (select [Contact Name] = case B.[Store Name]
                                when 'Community Store' Then
                                      'John A. Smith'      
                                 when 'City Store' Then
                                      'Marcus D. Jones'
                                 when 'County Store' Then
                                      'Mica L. Johnson'
                                 else
                                      'Elroy Watkins, Jr.'
                           end ) as CN   
        cross apply (select [Contact Title] = case B.[Store Name]
                                when 'Community Store' Then
                                      'Executive Vice President'      
                                 when 'City Store' Then
                                      'Manager'
                                 when 'County Store' Then
                                      'President of Operations'
                                 else
                                      'Clerk'
                           end ) as CT   

【问题讨论】:

唷,所有这些CASEs。您应该将该数据(例如商店的电话号码)存储在表中并加入它们。不要在查询中“存储”数据。 同意。 . .这些信息应该已经存储在某个地方。不确定为什么查询没有从表源中提取。将进一步挖掘。谢谢! 【参考方案1】:

我倾向于将此视为join

select C.[Store Number], sn.Store_Name, 
       v.phone_number, v.contact_name, v.contact_title
from Central_Account C cross apply
     (values (case when C.[Store Number] = 9146 and C.[Branch Number] In (14, 16, 18)
                   then 'Community Store'
                   when C.[Store Number] = 8147 and C.[Branch Number] In (24, 26, 28)
                   then 'City Store'
                   when C.[Store Number] = 7148 and C.[Branch Number] In (34, 36, 38)
                   then 'County Store'
                   when C.[Store Number] not in (9146, 8147, 7148)
                   then 'State Store'
              end)
     ) sn(store_name) join
     (values ('Community Store', '414.882.8278', 'John A. Smith', 'Executive Vice President'), 
             ('City Store', '221.332.6221', 'Marcus D. Jones',  'Manager'),
             ('County Store', '211.949.2008', 'Mica L. Johnson', 'President of Operations'),
             ('State Store', '635.588.1878', 'Elroy Watkins, Jr.', 'Clerk')
     ) v(store_name, phone_number, contact_name, contact_title)
     on sn.store_name = v.store_name or
        (sn.store_name is null and v.store_name = 'State Store';  

第一个cross apply 获取商店名称。第二个values 然后带来关于商店的所有相关信息。默认值有一个小技巧——因为一些商店名称是NULL,因为您已经设置了逻辑。这只是默认为状态存储。

【讨论】:

这工作得非常好——也很干净!谢谢你的帮助! *****

以上是关于sql在一个交叉应用/案例表达式中设置多个值的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 SQL 中一个属性check约束值只能是0或者1

在 linq 查询中设置动态排序名称字段

如何在 xamarin ContentPage 的 BindingContext 中设置多个值

如何以编程方式在所有应用程序中设置上部文本?

Mysql基础编写sql案例

在数据库中设置多个字段,仅从一个字段