2013-07-02 188 views
2

以下SELECT中的注释掉部分有什么问题?
如果我取消整个CASE ... END的注释,则SELECT变为无效。
我想要的是,取决于是否有送货地址,取一组地址字段或另一个地址字段,理想情况下无需重复条件或对每个字段使用COALESCE。我正在使用SQL Server 2008 R2。
谢谢!在SELECT中,根据字段值取一组字段或另一个字段

SELECT a, b, c, 
    --  CASE x is null 
    --   THEN d, e, f, 
    --   ELSE g, h, i, 
    --  END 
     k, l, m 
    FROM sometable 

回答

2

考虑把条件X在where子句,然后工会

select a,b,c,d,e,f from table where x is null 
union 
select a,b,c,g,h,i from table where x is not null 

的情况下的东西需要一个WHEN。我总是使用这种结构

CASE ... 
WHEN ... 
THEN ... 
ELSE ... 
END AS Fieldname 

所有5必须存在。它可以用来定义一个输入域。在它里面,你当然可以coallesce的,但它不会给回场

数组

编辑:ELSE其实没有必要,阅读知情的评论如下

+0

'CASE'表达式(他们不是 “东西”)做不需要“ELSE”部分。 –

+0

为了提高效率,最好使用'UNION ALL'。准确地说。 'UNION'将消除任何重复。 –

+0

好的,不知道ELSE部分是可选的,谢谢。这里是我的知识钻取:表达式表达式表达式表达式 –

2

该查询会给你正确的答案,这是还容易修改

select 
    s.a, s.b, s.c, 
    a.f1, a.f2, a.f3, 
    s.k, s.l, s.m 
from sometable as s 
    outer apply (
     select s.d as f1, s.e as f2, s.f as f3 where s.x is null 
     union all 
     select s.g as f1, s.h as f2, s.i as f3 where s.x is not null 
    ) as a 

SQL FIDDLE EXAMPLE

2

你缺少WHEN,而你只允许从CASE表达式返回一个值

SELECT a, b, c, 
     CASE WHEN x is null 
      THEN d 
      ELSE g 
     END, 
     CASE WHEN x is null 
      THEN e 
      ELSE h 
     END, 
     CASE WHEN x is null 
      THEN f 
      ELSE i 
     END, 
    k, l, m 
FROM sometable 

这还假定类型的dg是兼容的,因为是(eh)和(fi

+0

我不知道为什么这得到了downvote。这是一个非常有效的答案。 –

+0

@ypercube - 可能有人很恼火,我没有达到“理想情况下没有重复...” –

+0

我也猜到了。但是你的答案也是唯一一个清楚解释OP的查询不起作用的原因。 –

相关问题