2012-07-23 105 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