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

web*_*orm 0 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    | ?
Run Code Online (Sandbox Code Playgroud)

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

  1. 驱动程序的许可证,无
  2. 社会保障,无
  3. 国家-ID-无

所以我希望计算出的标识符列成为表模式的一部分.期望的结果将是......

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
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果是这样,我将使用什么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
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

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

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

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