从自己行中的值中选择的计算列的SQL

时间:2015-01-26 19:45:15

标签: sql sql-server sql-server-2012

我有一张桌子,可以存放一个人的几个识别符。在此表中,我想创建一个计算的标识符列,该列存储该记录的最佳标识符,具体取决于可用的标识符。

例如(一些虚构的样本数据)......

表=“公民”

Id | LastName | DL-No        | SS-No          | State-Id-No   | Calculated
------------------------------------------------------------------------
1  | Smith    | NULL         | 374-784-8888   | 7383204848    | ?
2  | Jones    | JG892435262  | NULL           | NULL          | ?
3  | Trask    | TSK73948379  | NULL           | 9276542119    | ?
4  | Clinton  | CL231429888  | 543-123-5555   | 1840430324    | ?

我知道我想选择标识符的顺序......

  1. 驱动-许可证否
  2. 社会保障,没有
  3. 国家-ID-否
  4. 所以我希望计算出的标识符列成为表模式的一部分。期望的结果将是......

    Id | LastName | DL-No        | SS-No          | State-Id-No   | Calculated
    ------------------------------------------------------------------------
    1  | Smith    | NULL         | 374-784-8888   | 7383204848    | 374-784-8888
    2  | Jones    | JG892435262  | NULL           | 4537409273    | JG892435262
    3  | Trask    | NULL         | NULL           | 9276542119    | 9276542119
    4  | Clinton  | CL231429888  | 543-123-5555   | 1840430324    | CL231429888
    

    这可能吗?如果是这样,我将用什么SQL来计算“计算”列中的内容?

    我在考虑类似......

    SELECT
      CASE
        WHEN ([DL-No] is NOT NULL) THEN [DL-No]
        WHEN ([SS-No] is NOT NULL) THEN [SS-No]
        WHEN ([State-Id-No] is NOT NULL) THEN [State-Id-No]
        AS "Calculated"
      END
    FROM Citizens
    

1 个答案:

答案 0 :(得分:5)

最简单的解决方案是使用coalesce()

select c.*,
       coalesce([DL-No], [SS-No], [State-ID-No]) as calculated
from citizens c

但是,如果您修改语法以使用case而不是when,我认为您的where语句也会有效。