2012-07-23 50 views
-3

我需要将下一列更新到包含特定数字的列。SQL Server:选择/更新下一列到?

将FF是表中的列C.

C1_K | C1_ID | C2_K | C2_ID | C3_K | C3_ID 

逻辑:

  • 查找其中number 5被发现是它在C1_K OR C2_K OR C3_K。
  • 如果它在C1_K中,则选择文本值C1_ID。
  • 如果在C2_K中,则选择文本值C2_ID。
  • 如果它在C3_K中,则选择文本值C3_ID。

请指教。我需要更新匹配的K列旁边的列。谢谢。

注:

  • 所有的C * _K列包含唯一的数字。
  • 所有C * _ID列都包含唯一文本。 (这些名字)

样本数据:

154 | NULL | 155 | SantoRyUu | 156 | NULL 

如果155选择SantoRyUu将被更新。

+0

如果值'5'是在所有三列? – Lamak 2012-07-23 15:48:11

+0

虽然这是不可能的:) – nambla 2012-07-23 15:57:04

+0

什么是“K,ID”对?看起来像一个[重复组](http://en.wikipedia.org/wiki/First_normal_form),应该分离出它自己的表 – 2012-07-23 16:03:34

回答

0

(设计问题放在一边。)

就不得不提到的名字列,因为SQL Server没有语法“下一个。”你也许可以用动态SQL做到这一点,但是糟透了。这是一个可能性:

CREATE TABLE dbo.C 
(
    C1_K INT, 
    C1_ID VARCHAR(32), 
    C2_K INT, 
    C2_ID VARCHAR(32), 
    C3_K INT, 
    C3_ID VARCHAR(32) 
); 

INSERT dbo.C(C1_K, C2_K, C3_k) 
SELECT 5,1,2 
UNION ALL SELECT 2,5,7 
UNION ALL SELECT 3,4,6; 

DECLARE @MagicNumber INT; 
SET @MagicNumber = 5; 

UPDATE dbo.C SET 
C1_ID = CASE C1_K WHEN @MagicNumber THEN 'yes' ELSE C1_ID END, 
C2_ID = CASE C2_K WHEN @MagicNumber THEN 'yes' ELSE C2_ID END, 
C3_ID = CASE C3_K WHEN @MagicNumber THEN 'yes' ELSE C3_ID END; 

SELECT * FROM dbo.C; 

结果:

C1_K C1_ID C2_K C2_ID C3_K C3_ID 
---- ----- ---- ----- ---- ----- 
5  yes 1  NULL 2  NULL 
2  NULL 5  yes 7  NULL 
3  NULL 4  NULL 6  NULL 
0

如果您有关于* _K列的索引,你应该试试这个

select C1_id 
from table where c1_k = 155 
union all 
select C2_id 
from table where c2_k = 155 
union all 
select C3_id 
from table where c3_k = 155 

如果这些列上没有索引

select 
--coalesce(C1_id,c2_id,c3_id) --if you are sure other two columns values will be null 
case 
when c1_k = 155 then c1_id 
when c2_k = 155 then c2_id 
when c3_k = 155 then c3_id 
end --in case you have values for other columns as 
--well like for 154 you might not have null but some other value.. 

from table where c1_k = 155 
or c2_k = 155 
or c3_k = 155 

更改上述查询以防万一您有更多的列这样.. 但最好的解决办法是让你的colums行..

+0

它是一个现成的系统。我需要处理它:)设计失败。 – nambla 2012-07-23 17:53:32