AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 200319
Accepted
tinlyx
tinlyx
Asked: 2018-03-15 20:55:56 +0800 CST2018-03-15 20:55:56 +0800 CST 2018-03-15 20:55:56 +0800 CST

什么时候在 PL/pgSQL 函数中需要 SELECT?

  • 772

在 PL/pgSQL 中将函数或表达式的结果赋值给变量时,什么时候需要使用SELECT语句(子查询)?

这可能只是我对 SQL 的误解。我认为一切都应该包含在 a 中(SELECT ...)(即使它只涉及计算一个数字),例如

$$
DECLARE parts text[];
BEGIN
  parts := (SELECT string_to_array(my_str,'_') );
...
$$

但我只是发现它没有SELECT:

parts := string_to_array(my_str,'_');

(就好像我可以像使用 Pascal 一样使用 PL/pgSQL。)

一般情况下,什么样的表达式可以不SELECT计算值而直接使用?

postgresql plpgsql
  • 2 2 个回答
  • 68 Views

2 个回答

  • Voted
  1. Best Answer
    tinlyx
    2018-03-16T08:02:55+08:002018-03-16T08:02:55+08:00

    这只是一个有根据的猜测。

    似乎SELECT是不必要的,因为它已经存在,例如在SELECT ... INTO赋值:=等价于的隐式中。从文档中:

    一个 PL/pgSQL 变量的赋值被写成:

    变量 { := | = } 表达式;

    如前所述,此类语句中的表达式是通过发送到主数据库引擎的 SQL SELECT 命令求值的。

    此处可能显示一个示例,其中:

    name := (SELECT t.name from test_table t where t.id = x);
    

    也可以写成

    name := t.name from test_table t where t.id = x;
    

    这似乎是可能的,因为第二个简化形式等同SELECT INTO于 PL/pgSQL 中的 a:

    SELECT test_table.name INTO name FROM test_table WHERE id = x;
    

    第一种形式相当于:

    SELECT (SELECT t.name from test_table t where t.id = x) INTO name;
    

    ,其中有一个SELECT可以删除的冗余层。

    另一方面,当隐式SELECT不存在时,显式SELECT似乎是必要的。比如同一个函数不能直接使用(即不用SELECT)

    string_to_array(my_str,'_');
    

    如果它不在对变量的赋值中。

    • 1
  2. Jasen
    2018-08-01T13:26:43+08:002018-08-01T13:26:43+08:00

    简短回答每个表达式都是一个选择语句。

    https://www.postgresql.org/docs/10/static/plpgsql-expressions.html

    PL/pgSQL 语句中使用的所有表达式都使用服务器的主 SQL 执行器进行处理。

    这意味着您可以在赋值语句和 after if 语句中使用 from 子句等。

    IF count(*) > 10  FROM foo_table GROUP BY ORDER BY count(*) DESC LIMIT 1 
    THEN
       -- handle the case when there exists a y group larger than 10 
    
    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve