【问题标题】:How can I use a postgres variable in my SELECT statement?如何在我的 SELECT 语句中使用 postgres 变量?
【发布时间】:2019-05-17 20:50:22
【问题描述】:

我将一个值存储在变量featureId 中,然后尝试在我的 SELECT 语句中使用该值,但 postgres 似乎按字面意思使用该名称并查找名为“featureid”的列。我收到一个错误“错误:列“featureid”不存在 第 4 行:featureId,”

我的代码如下。如何在 SELECT 语句中使用变量的值?

SELECT id INTO featureId FROM tableA WHERE NAME = 'some value';

INSERT INTO tableB (client_id, feature_id, does_have)
  SELECT
  id,
  featureId,
  TRUE
FROM tableA

【问题讨论】:

  • 声明和块的其余部分在哪里?
  • @stickybit 没有。我现在只是在编辑器中逐条运行
  • 你想写一个触发器吗?

标签: sql postgresql select


【解决方案1】:

如果没有声明变量,您的SELECT INTOSELECT INTO that creates a table 的版本。要亲自查看,请尝试:

SELECT id
       INTO featureid
       FROM tablea
       WHERE name = 'some value';

SELECT *
       FROM featureid;

为了给变量赋值,必须声明变量。您可以使用匿名 DO 块。

DO
$$
DECLARE
  featureid tablea.id%TYPE;
BEGIN
  SELECT id
         INTO featureid
         FROM tablea
         WHERE name = 'some value';

  INSERT INTO tableb
              (client_id,
               feature_id,
               does_have)
              SELECT id,
                     featureid,
                     true
                     FROM tablea;
END;
$$
LANGUAGE plpgsql;

【讨论】:

    【解决方案2】:

    您尝试执行的操作几乎没有错误:

    • sql 是 declarative 语言,所以你问的是怎么做而不是怎么做,这是因为你不能存储变量,一些语句,如 declare 和 begin-end 应该用于触发器而不是简单的查询。
    • 您正在执行两条语句:selectinsert into,它们一个接一个地执行,因此您再次无法存储变量。
    • insert into,插入一条记录,但您可能正在尝试使用您的 select 语句检索更多数据(如果 NAME 不是唯一的)

    如果 'some-value' 是一个已知常量并且 NAME 是唯一的,只需将该值插入到 insert into 的 where 子句中。如果您尝试插入更多数据,请查看 postgres 的 bulk insert 语法:bulk insert

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2017-03-02
      • 2017-03-29
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多