2010-07-26 75 views
10

我有这样选择基于另一列的值的特定列

ID | Type | Val0 | Val1 
1 | 0 | A | NULL 
2 | 1 | NULL | B 

我需要选择Val0当类型为0,并且Val1当类型是1,并且ValN表时类型是N ...

我该怎么做?

+0

您能否提供预期产出的样本? – 2010-07-26 20:27:43

+0

'SELECT ... WHERE ID = 1 - A' – BrunoLM 2010-07-26 20:29:07

+0

只是一个快速评论:如果你有这样的表格,你应该考虑一个不同的模式。你的数据库几乎肯定不会遵循实体关系模型。 – Borealid 2010-07-26 20:30:18

回答

15
SELECT CASE 
      WHEN Type = 0 THEN Val0 
      WHEN Type = 1 Then Val1 
      . 
      . 
      WHEN Type = N Then ValN 
     END 
    FROM tbl 
+0

这显然确实有一个问题,但如果你使用另一个数据库的表,因为显然Sql Server然后施加最大数量为10的情况...这非常小。 – eidylon 2011-11-09 16:46:40

3

我看这个问题的方法,你需要使用UNION:

SELECT a.val0 
    FROM TABLE a 
WHERE a.type = 0 
UNION ALL 
SELECT a.val1 
    FROM TABLE a 
WHERE a.type = 1 
UNION ALL ... 

UNION ALL不删除重复项,比UNION快(因为它消除重复)。

动态地做到这一点是可能的。

+0

我将它解释为“根据给定的类型给我一个单一的值”。但你可能是完全正确的。这是很好的要求一个预期的输出:)。 – dcp 2010-07-26 20:30:50

+0

@dcp:我一直被我的错误假设咬了太多次 - 我在等待,看看它是否对其他人有意义 – 2010-07-26 20:32:51

2

如果N值低,则可以使用CASE statement,像CASE Type WHEN 0 THEN Val0 WHEN 1 THEN Val1 END做即席。如果你的N更大,你应该规范你的数据库(即把ID => ValN映射到不同的表中)。

+0

CASE声明效果很好。规范化建议是好的,但并不总是可行的,当你与别人数据库进行集成时。不幸。 – eidylon 2011-11-09 16:45:16

相关问题