【问题标题】:Selecting a column value using a fieldname as column name使用字段名作为列名选择列值
【发布时间】:2014-08-07 12:46:58
【问题描述】:

我确信一定有一种更简单的方法可以做到这一点,我只是想弄清楚我是如何设置的,这让自己陷入了进一步的混乱!

我有一个价格查询表,它有 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 并将字段名传递给它,但对于我要查找的内容来说似乎太复杂了?

感谢收看!

(添加编辑)

-----------编辑--------------

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

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

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

【问题讨论】:

  • 你能用更有意义的方式详细说明。你想达到什么目的???
  • 如果您能够规范您的数据库设计,您应该这样做。如果你不知道这意味着什么,我听说过这本书的好东西,数据库设计为凡人。

标签: sql sql-server sql-update


【解决方案1】:

如果我理解正确,您可以使用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 子句来获得相同的效果(在调整表名和列名之后)。

【讨论】:

  • 嗨,戈登,这对我来说是正确的,我只需要更改一些语法,因为它目前不起作用。您可以按上述方式检查我的编辑,看看这是否会改变您的答案?问候
  • Brilliant Gordon 已在我的示例中运行,现在我可以将其移动到存储过程中以用于我的工作。问候
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多