【问题标题】:Select a specific column based on another column's value根据另一列的值选择特定列
【发布时间】:2010-07-27 04:58:35
【问题描述】:

我有一张这样的桌子

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

类型为0时需要选择Val0,类型为1时选择Val1,类型为N时选择ValN...

我该怎么做?

【问题讨论】:

  • 你能提供一个预期输出的样本吗?
  • SELECT ... WHERE ID = 1 -- A
  • 简短评论:如果您有这样的表,您应该真正考虑不同的架构。您的数据库几乎可以肯定不遵循实体关系模型。
  • 只是出于好奇:为什么首先将 Val0、Val1... 存储在不同的列中?
  • 我别无选择,这是 Telerik 的 Sitefinity 的表格。

标签: sql sql-server tsql


【解决方案1】:
SELECT CASE
          WHEN Type = 0 THEN Val0
          WHEN Type = 1 Then Val1
          .
          .
          WHEN Type = N Then ValN
       END 
  FROM tbl

【讨论】:

  • 如果您使用的是来自另一个数据库的表,这显然确实有问题,因为显然 Sql Server 然后强加了 10 的最大案例数......这非常小。
【解决方案2】:

按照我的阅读方式,你需要使用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 更快(因为它会删除重复项)。

可以动态执行此操作。

【讨论】:

  • 我把它解释为“根据给定的类型给我一个单一的值”。但你可能是完全正确的。要求预期的输出很好:)。
  • @dcp:我被我的错误假设咬了太多次 - 我在观看时询问并等待,看看它是否对其他人有意义
【解决方案3】:

对于较低的 N 值,您可以使用 CASE statement 临时进行,例​​如 CASE Type WHEN 0 THEN Val0 WHEN 1 THEN Val1 END。如果您的 N 较大,您可能应该规范化您的数据库(即将 ID => ValN 映射放在不同的表中)。

【讨论】:

  • CASE 语句运行良好。当您与其他人的数据库集成时,规范化建议很好,但并非总是可行。不幸的是。
【解决方案4】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多