按NOT NULL值的数量对结果进行排序

Sal*_*n A 1 sql t-sql sql-server sorting

我有一个查询,其中每行包含3列:

  1. 名称
  2. 距离
  3. 接近

我想根据NOT NULL(当前)值的数量对行进行排序,具体如下:

  1. 所有值都存在
  2. 此顺序中存在两个值
    • 名称和距离
    • 姓名和邻近
    • 距离和接近度
  3. 存在一个值
    • 名称
    • 距离
    • 接近

这是示例数据(插入语句按照我期望的顺序排序):

/*
CREATE TABLE #TEMP (
    Type      VARCHAR(100),
    Name      VARCHAR(100),
    Distance  VARCHAR(100),
    Proximity VARCHAR(100)
);
*/
INSERT INTO #TEMP VALUES ('AIRPORT', 'KBLI', '21mi', 'City')
INSERT INTO #TEMP VALUES ('AIRPORT', 'KBLI', '21mi',  NULL )
INSERT INTO #TEMP VALUES ('AIRPORT', 'KBLI',  NULL , 'City')
INSERT INTO #TEMP VALUES ('AIRPORT',  NULL , '21mi', 'City')
INSERT INTO #TEMP VALUES ('AIRPORT', 'KBLI',  NULL ,  NULL )
INSERT INTO #TEMP VALUES ('AIRPORT',  NULL , '21mi',  NULL )
INSERT INTO #TEMP VALUES ('AIRPORT',  NULL ,  NULL , 'City')
Run Code Online (Sandbox Code Playgroud)

我在COALESCE声明方面取得了一些成功,但我正在寻找有效且易读的东西.稍后我将改为四列.

Boh*_*ian 5

将当前值分配为数字(名称= 4,距离= 3,接近度= 2),然后对它们求和并按其排序:

select ...
from ...
order by
  case when name is null then 0 else 4 end +
  case when distance is null then 0 else 3 end +
  case when proximity is null then 0 else 2 end desc
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是3 + 2> 4,所以距离和接近度胜过一个名字.