2013-10-07 137 views
1

给定一个表:更新使用case语句

ColumnPosition, ColumnName 
    Col 1,   NULL 
    Col 2,   NULL 
    Col 3,   NULL 

我想根据基于ColumnPosition预定值映射到更新ColumnName

例如:
如果ColumnPosition = '西1' 然后更新的ColumnName是 '名称' 如果ColumnPosition = '西3' 然后更新的ColumnName是 '地址'

这怎么可能使用CASE语句完成?

+1

你没有。您无法选择案例中的列名称。 – GolezTrol

+0

我看到想要这样做的小逻辑。即使在不合逻辑的时刻,我也不想这样做。你用这个'erm解决方案试图解决什么问题? –

+0

@TonyHopkinson - 它的漫长故事:) – Steam

回答

6

我想你的意思UPDATE而不是INSERT

UPDATE MyTable 
SET ColumnName = CASE WHEN ColumnPosition = 'Col 1' THEN 'Name' 
         WHEN ColumnPosition = 'Col 3' THEN 'Address' 
         -- ... the rest of your conditions 
         ELSE -- put your default value here 
       END 
+0

哦,是的。更新是正确的词。 – Steam

+0

现在,我正在写OO代码来生成70+ WHEN语句:)这段代码会很大:(除非,conrad的代码可以修改为给我预期的输出 – Steam

5

而不是做了一堆case语句,你可以建立一个地图,然后做一个连接

With Map as 
(
    SELECT  'Col 1' ColumnPosition , 'Name' as ColumnName 
    UNION SELECT 'Col 3' , 'Address' 
) 
UPDATE Table1 
SET Table1.ColumnName = Map.ColumnName 
FROM 
    table1 
    INNER JOIN MAP 
    ON Table1.ColumnPosition = Map.ColumnPosition; 

DEMO

+0

+1 - 我喜欢答案你如何做一个更好的设计。好的一个:-) –

+0

谢谢,但它没有按预期工作。它应该设置每一次出现的情况,比如第3列的地址或您决定的任何事情。列3在列中出现多次,其他值也会出现多次。 – Steam

+1

@blasto'Col 3'多次出现。 [这是一个演示](http://sqlfiddle.com/#!3/7ecee/1),其中最初的数据集包含col3上的模糊。简单的例子可能会丢失一些东西 –