回答

收藏

从多列中选择值到单列中

技术问答 技术问答 187 人阅读 | 0 人回复 | 2023-09-14

我在数据库中有一个表,该表有9列包含相同种类的数据,这些值 允许为null' `1 ^0 q- q+ c8 E6 R0 E
。我需要将每个非null值选择到单列的值中,这些值不关心它们源自的行的身份。, a9 Z$ Y- G1 w' `; g2 }. v
因此,对于一个看起来像这样的表:( F9 ]# Q' p4 f; x  q5 w9 u
+---------+------+--------+------+
2 P* e: L8 \3 J" Q! Q5 o2 c|   Id    | I1   | I2     | I3   | 0 \4 G! K1 @, Z) P+ D
+---------+------+--------+------+9 s* L/ x' i: p6 m! V, s" Z
|    1    | x1   | x2     |  x7  |9 n; `$ R7 _- e/ c7 a- U/ I
|    2    | x3   | null   |  x8  |
6 C2 i( \/ E  E/ _# Q* Y! P|    3    | null | null   |  null|) A) _9 j  I- ?8 b! J# @: T4 o: O: U
|    4    | x4   | x5     |  null|' \/ i8 Q9 S0 o$ B, W& \5 T
|    5    | null | x6     |  x9  |
' B+ z' b6 w" f* u' O5 A' p$ B+---------+------+--------+------+
* s, C1 O+ {3 x3 L我希望将每个以x开头的值选择到一列中。我得到的数据应如下表所示。需要保留顺序,因此第一行的第一列值应该在顶部,而最后一行的最后列值应该在底部:; {5 O) @7 [% ^# V
+-------+
3 s6 {9 d5 w  g$ J* S| value |
; y9 C" h3 o( [- U+-------+3 c) w9 D6 C& o
|  x1   |+ l! c$ N+ p  [* R2 W" r4 |/ O, ^
|  x2   |
( P& E, O1 G/ C& [0 ||  x7   |; |2 W* {: Z/ R, g* I
|  x3   |
, q8 s. ]4 v+ g+ n, w& v; ^|  x8   |
& i( c$ |1 d6 l& q, v4 T! n) J1 b|  x4   |5 H. o0 M0 z( a  B5 H6 F2 I6 H
|  x5   |
1 l. g* w' U. D6 f1 i9 W) ~8 F5 [5 ~|  x6   |7 k1 C  Z) B; F  E" f6 I
|  x9   |
" F+ }* i: p% Y$ U+ E$ {+-------+
$ r" t+ |$ x( a% {2 R8 q* y! p/ o. C我正在使用 SQL Server 2008 R2 。是否有比从每行依次选择每一列的值并将非空值插入结果更好的技术呢?! Y, @5 b1 o/ B
               
! s, ?) n; a1 }! a7 ?解决方案:2 q9 F: \+ f' I0 l, J
                ( ~0 v3 w$ u5 _) a* V/ N9 f
* i; }& o; F" w  j% S
9 u9 ?, t) ?  G
                您可以使用UNPIVOT函数获得最终结果:
$ c9 B/ o; g; E% O, e" h8 Cselect value
1 j# l' y& o1 f1 x. H9 O' Rfrom yourtable6 U9 j$ L& p& U5 q- }
unpivot
% q7 }9 W7 O1 c5 Q. T(
3 `) J( }. p) |+ L$ `$ P8 m  value- z# ?& K4 `$ n4 r, {1 X# i8 k
  for col in (I1, I2, I3)- W4 F; \9 @$ M" `2 K
) un
' x% I! N3 k# x- D  _5 O2 X6 Norder by id, col;
- o- c1 Q% }, ^由于您使用的是SQL Server 2008+,因此还可以将CROSS APPLY与VALUES子句一起使用来取消透视列:
* k+ i# N4 r8 Y0 ^7 ~7 Fselect value: r9 M- i! F, @6 C  n9 I
from yourtable
6 D, m* ?8 T' f6 Z* ^- Rcross apply
# g1 t, O3 }- k) W2 q(  K4 B& [! u* n& N' }3 D2 q) r
    values  I& C* D. ?( R3 r) |% p
        ('I1', I1),
3 |" Q- v  ]: l2 V( u" [& Z$ y8 D" Y        ('I2', I2),8 ]' e# ~. [/ m1 u
        ('I3', I3)0 S3 M3 I1 r3 `' Y1 o
) c(col, value)& l( i9 D$ ~4 c; X/ i$ W' z/ Z
where value is not null
5 A7 e+ F' R3 [! Corder by id, col
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则