从 SQL 中的行本身动态地 select 中的列到 select

Dynamically selecting the column to select from the row itself in SQL

我有一个 SQL 服务器 table 有一些数据如下。 P 列的数量是固定的,但列数会太多。时尚会有多个栏目,如S1,S2等

Id SelectedP P1 P2 P3 P4 P5
1 P2 3 8 4 15 7
2 P1 0 2 6 0 3
3 P3 1 15 2 1 11
4 P4 3 4 6 2 4

我需要写一个SQL语句来得到下面的结果。基本上,需要从每一行中 selected 哪一列取决于该行本身的 SelectedP 值。 SelectedP 包含每行 select 的列。

Id SelectedP Selected-P-Value
1 P2 8
2 P1 0
3 P3 2
4 P4 2

提前致谢。

你只需要一个CASE表达式...

SELECT
  id,
  SelectedP,
  CASE SelectedP
    WHEN 'P1' THEN P1
    WHEN 'P2' THEN P2
    WHEN 'P3' THEN P3
    WHEN 'P4' THEN P4
    WHEN 'P5' THEN P5
  END
    AS SelectedPValue
FROM
  yourTable

对于 CASE 表达式中未提及的任何内容,这将 return NULL


编辑:

一个选项,只需 一点 少输入...

SELECT
  id, SelectedP, val  
FROM   
  yourTable AS pvt
UNPIVOT  
(
  val FOR P IN   
  (
    P1,
    P2,
    P3,
    P4,
    P5
  )
)
  AS unpvt
WHERE
  SelectedP = P

注意:如果SelectedP的值在UNPIVOT中不存在,那么row 根本不会出现 (不像 CASE 表达式 return a NULL

演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b693738aac0b594cf37410ee5cb15cf5


编辑 2:

我不知道这是否会比第二个选项执行得更差,但这保留了 NULL 行为。

(首选还是修复你的data-structure。)

SELECT
  id, SelectedP, MAX(CASE WHEN SelectedP = P THEN val END) AS val
FROM   
   yourTable AS pvt
UNPIVOT  
(
  val FOR P IN   
  (
    P1,
    P2,
    P3,
    P4,
    P5
  )
)
  AS unpvt
GROUP BY
  id, SelectedP

演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f3f64d2fb6e11fd24d1addbe1e50f020