尝试在UPDATE语句中的SET之后对字符串使用CAST到varchar - Postgres

时间:2017-12-01 05:27:10

标签: postgresql casting sql-update

我正在尝试将一个字符串从Web应用程序的用户输入转换为varchar。我想更改给定某个ID(主键)的列之一的值,并且列名是我作为varchar投射的。

CREATE OR REPLACE FUNCTION changeQuantities(productID varchar, warehouseID int, change int) 
RETURNS void AS $$
BEGIN
  EXECUTE format('UPDATE warehouses SET CAST(%I AS VARCHAR) = %s WHERE warehouseID = %s', productID, change, warehouseID)
    USING change, warehouseID;
END;
$$ LANGUAGE plpgsql;

'productID'是列名,'change'是新值,'warehouseID'是表的主键。 '仓库'就是桌子。这是我收到的错误:

SELECT changeQuantities('bg412',1,100);
ERROR:  syntax error at or near "CAST"
LINE 1: UPDATE warehouses SET CAST(bg412 AS VARCHAR) = 100 WHERE war...
                              ^
QUERY:  UPDATE warehouses SET CAST(bg412 AS VARCHAR) = 100 WHERE warehouseID = 1
CONTEXT:  PL/pgSQL function changequantities(character varying,integer,integer) line 3 at EXECUTE statement

我有另一个函数,就像它在转换列名时使用SELECT语句一样,它工作得很好。我可以在SET之后再投出一些东西吗?我没有在这个特殊情况下找到任何东西,所以我要么被羞辱,要么我会帮助别人解决类似的问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您不能在作业的左侧使用cast() - 并且您不需要它,因为已知列的数据类型。如果有的话,您需要将赋值的手侧转换为左侧的数据类型。

假设bg412是列名,您需要:

CREATE OR REPLACE FUNCTION changeQuantities(productID varchar, warehouseID int, change int) 
RETURNS void AS $$
BEGIN
  EXECUTE format('UPDATE warehouses SET %I = %s WHERE warehouseID = %s', productID, change, warehouseID)
    USING change, warehouseID;
END;
$$ LANGUAGE plpgsql;

无关,但是:使用产品的ID作为表格中的列名称似乎是一种可怕的设计。如果你拥有一百万种产品,你会怎么做?