标签: functions

Postgres - 如果正则表达式匹配失败则返回默认值

我想尝试正则表达式匹配,null如果失败则返回。

以下查询尝试查找字符串中的第一个数字。结果会忽略带有 text 的条目'blah'。我更希望它返回一个null值。

这个问题可能与正则表达式无关,更多地与集合代数有关。我的预感是,有一种优雅的方法可以做到这一点,而不需要left join任何东西,尽管谷歌搜索被证明是徒劳的。

with test_data as (
  select 'abc 123' as txt
  union
  select 'abc 456' as txt
  union
  select 'blah' as txt
)

select
  txt,
  (regexp_matches(txt, '\d+'))[1] as first_num
from
  test_data
Run Code Online (Sandbox Code Playgroud)

postgresql pattern-matching functions set-returning-functions regex

3
推荐指数
1
解决办法
7561
查看次数

如何确定是否可以内联 SQL 函数?

这个答案中, Erwin 将IMMUTABLE函数分解为可以内联的函数和不能内联的函数。他有一个例子to_char(),表明IMMUTABLE函数 overto_char()实际上会更慢

不过这很有趣,因为我什至不知道to_char()不是IMMUTABLE。此外,我不知道这IMMUTABLE会让任何事情变得更慢。我现在的问题是,如何确定标记为IMMUTABLE内联的函数是否被内联?

postgresql performance optimization execution-plan functions

3
推荐指数
1
解决办法
312
查看次数

如何在postgres的表上创建`而不是`触发器?

我想在 postgresql 中为一个表创建一个触发器。我的表包含有关事件的数据,包括房间号、开始时间和事件持续时间。在新插入表时,我想检查新事件的房间号在新事件发生时是否会很忙。如果是这样,那么我想引发异常,否则将新事件插入表中。我想将触发器声明为instead of触发器,insert但 postgres 不允许在表instead ofinsert操作触发器(我不想只为触发器创建视图)。

我该如何解决这个问题?理论上我可以创建一个after触发器,然后检查新插入的数据是否有效,如果无效则删除。但这在概念上似乎是错误的方法,实际上也可能是错误的(我不确定触发器是否是原子的,也许有人可能已经根据错误的数据做出了错误的决定)。

这是表定义:

create table room_schedule(
  start_date date,
  start_time time,
  room_no int,
  event_id int,
  duration interval,
  primary key(start_date, start_time, room_no, event_id)
);
Run Code Online (Sandbox Code Playgroud)

这是我的触发器和函数定义:

create or replace function inserttrigfunc() returns trigger as $$
declare count int;

begin

with end_time_table(eid, stime, etime) as (
        select event_id, start_time, (start_time + duration) as etime from room_schedule
        where room_no=new.room_no
    ),
        overlapping_time_table(eid, stime, etime) as(
            select * from end_time_table
            where …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger insert functions

3
推荐指数
1
解决办法
1529
查看次数

如何在过程(不是函数)中使用变量?

据我了解,在 Postgres 中,过程用于操作数据,函数用于读取数据。我想要:

  1. 声明一个变量
  2. 选择一个值到一个变量中
  3. 将变量插入另一个表
  4. 在事务中执行此操作
  5. 在存储过程中执行此操作
  6. 必要时回滚

CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
    BEGIN;
        DECLARE some_id INTEGER;
        SELECT nextval('some_sequence') INTO some_id;
        INSERT INTO some_table (some_column) VALUES (some_id);
    END;
$$;
Run Code Online (Sandbox Code Playgroud)

以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。

postgresql transaction plpgsql functions sql-procedure

3
推荐指数
1
解决办法
9629
查看次数

如何确定需要为新创建的登录分配哪些权限?

我们有 4 个包含不同程序和功能的数据库。到目前为止,实际应用程序只能使用 sa 帐户访问数据库,现在我想将应用程序更改为使用 sa 帐户以外的其他帐户。为此,我需要创建一个新的 SQL 登录名并为该登录名分配某些权限。有没有类似脚本的方法来确定我需要为新创建的用户分配什么权限?

stored-procedures permissions role functions sql-server-2014

3
推荐指数
1
解决办法
63
查看次数

SELECT sql_function(...) 与 SELECT * FROM sql_function(...)

我第一次阅读 PostgreSQL 文档,当面对 SQL 函数时,我认为我已经理解了所有基础知识,但仍然看不出SELECT sql_function(...)SELECT * FROM sql_function(...)以及何时使用其中一个的区别。

postgresql functions

3
推荐指数
1
解决办法
4193
查看次数

如何创建一个返回值的 postgres 函数

我正在尝试将一些网络应用程序逻辑转移到 postgres 函数中。但是我在创建一个非常基本的插入函数时遇到了一些错误。

这是我正在尝试创建的功能;

CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
RETURNS text AS 
$BODY$
BEGIN
   insert into users (unqid, thumb, email, password) 
   values (gen_random_uuid(), thumb, email, password)
   returning unqid ;
END;
$BODY$
  LANGUAGE plpgsql
  VOLATILE
Run Code Online (Sandbox Code Playgroud)

如果插入成功,我试图让函数返回项目的 uuid。我这样称呼它;

select * from create_user('newuser@mail.com', 'passpopcorn', 'thumbelinaurl');
Run Code Online (Sandbox Code Playgroud)

收到此错误;

SQL Error [42601]: ERROR: query has no destination for result data
  Where: PL/pgSQL function create_user(email,text,text) line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)

从我的谷歌搜索看来,当查询中没有 return 语句时,似乎会出现此错误。但在我的插入查询中,我确实有一个返回语句。

额外问题;对于简单的插入语句(例如这里的这个语句,或者带有几个选择后跟一个插入的语句),函数或过程会是更好的选择吗?

postgresql insert functions

3
推荐指数
1
解决办法
8670
查看次数

错误:无法从函数执行 CREATE MATERIALIZED VIEW ...WITH DATA

我需要CREATE MATERIALIZED VIEW ... WITH DATA从函数/过程执行,但我得到了ERROR: CREATE MATERIALIZED VIEW ... WITH DATA cannot be executed from a function.

除了使函数返回创建查询文本并复制粘贴以执行它之外,还有其他解决方法吗?

看起来真的很傻,但我想这背后有一个很好的理由......无论如何,这个限制有什么解决方法吗?

我正在运行 postgresql 15。

postgresql stored-procedures materialized-view functions postgresql-15

3
推荐指数
1
解决办法
1429
查看次数

DB2 相当于 T-SQL 的 REPLICATE?

在 T-SQL 中有一个方法,REPLICATE(char,N),它会生成一个包含某个字符的 N 个值的字符串。这在查询 JDE 时非常有用。
有谁知道是否有与此等效的 DB2?

db2 functions

2
推荐指数
1
解决办法
3923
查看次数

使用 plpgsql 进行递归查询

我正在尝试编写一个plpgsql函数,该函数从树结构中的记录递归返回一组列。

我有一个数据表和一个将数据链接在一起的表:

DATATABLE
-----------
id integer
value text
info text

LINKTABLE
-----------
link integer
parent integer
Run Code Online (Sandbox Code Playgroud)

我的想法是在以下功能中做类似的事情:

CREATE OR REPLACE FUNCTION my_function(itemID integer)
  RETURNS TABLE(id integer, value text) AS
$BODY$
BEGIN    
    RETURN QUERY SELECT my_function(A.link) FROM linktable A, datatable B 
        WHERE A.parent = B.id AND B.id = itemID) C;

    RETURN QUERY SELECT id, value FROM datatable WHERE id = itemID;            
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我在第一个查询中遇到错误:

错误:查询结构与函数结果类型不匹配

我的Just-In-Brain编译器没有检测到任何问题,那么我在这里做错了什么?

postgresql plpgsql functions postgresql-9.2

2
推荐指数
1
解决办法
7433
查看次数