使用fieldname作为列名选择列值

时间:2014-08-07 12:46:59

标签: sql sql-server sql-update

我确信我必须有一种更简单的方法来做这件事,我只是想让自己陷入困境,试图了解我如何设置它!

我有一个价格查询表,根据数量有4种不同的价格,因此下面的表格布局显示了productID,数量,然后是4个价格(价格因范围而异)

product ID  quantity    range 1 range 2 range 3 range 4
1              1         231      265     395     231
1              2         315      345     615     315
1              3         415      485     775     415

在用户选择了产品和所选数量的另一个表格中,我在其自己的列中选择了所选范围的名称以及数量和产品ID

product ID  quantity    range name  price
1              2         range 1     xxx <- Needs to be 315

我正在尝试执行某种UPDATE语句,以便我可以在订单行表中检索并存储数量为2(315英镑)的范围1的价格,但不知道如何加入这两个桌子在一起?

我已经研究过使用Range Name字段的值作为变量,并在SQL语句中使用EXEC并将字段名传递给它,但它似乎对我要查找的内容过于复杂?

感谢您的期待!

(已添加编辑)

----------- -------------- EDIT

这是我可用于更新价格的SQL,但下面SQL中字段“范围1”的实际名称可能会发生变化,具体取决于用户在选择时选择的范围...

UPDATE tblOrderline
SET price = (SELECT ***'range 1'*** FROM tblPriceLookup WHERE quoteProductID = 1 AND qty = 2)
WHERE orderID = 13 AND quoteProductID = 1

-----------编辑结束--------------

1 个答案:

答案 0 :(得分:5)

如果我理解正确,您可以使用update / joincase声明执行此操作:

update othertable ot join
       pricelookup pl
       on ot.productId = pl.productId and ot.quantity = pl.quantity
    set price = (case when rangename = 'range1' then range1
                      when rangename = 'range2' then range2
                      when rangename = 'range3' then range3
                      when rangename = 'range4' then range4
                 end);

编辑:

我认为你仍然需要case状态:

UPDATE tblOrderline ol
    SET price = (SELECT (case when ol.rangename = 'range1' then pl.range1
                              when ol.rangename = 'range2' then pl.range2
                              when ol.rangename = 'range3' then pl.range3
                              when ol.rangename = 'range4' then pl.range4
                         end)
                 FROM tblPriceLookup pl
                 WHERE pl.quoteProductID = 1 AND pl.qty = 2
               )
    WHERE orderID = 13 AND quoteProductID = 1;

通过在第一个查询中添加where子句(调整表名和列名后),您应该能够获得相同的效果。