gpt4 book ai didi

sql - 如果在 table1 中找不到记录,则从 table2 中选择的函数?

转载 作者:行者123 更新时间:2023-11-29 13:30:30 25 4
gpt4 key购买 nike

我想用 2 个 SELECT 语句在 Postgres 中编写一个函数/过程。首先,我从 table1 中选择,如果 table1 中没有匹配的记录,则对 table2 执行相同的 SELECT。例如

function getRecord(String: inValue){
If (select col1, col2 from table1 where col3=inValue) then
return the row (with col1 and col2);
else
return select col1, col2 from TABLE2 where col3=inValue;
}

是否可以在 PostgreSQL(9.1 及以上版本)中使用这样的函数?

最佳答案

您可能不需要函数,只需要查询。但是这里是:

PL/pgSQL 函数

CREATE OR REPLACE FUNCTION get_record(_value text)
RETURNS TABLE(col1 int, col2 text) AS -- replace with actual columns / types
$func$
BEGIN

RETURN QUERY
SELECT col1, col2 FROM table1 WHERE col3 = _value;

IF NOT FOUND THEN
SELECT col1, col2 FROM table2 WHERE col3 = _value;
END IF;

END
$func$ LANGUAGE plpgsql;
  • 您可以使用 special variable FOUND检查。

  • 这可以返回任意数量的行,如果第一个查询没有返回任何内容,则调用第二个查询。

SQL函数

CREATE OR REPLACE FUNCTION get_record(_value text)
RETURNS TABLE(col1 int, col2 text) AS -- replace with actual columns / types
$func$

SELECT col1, col2 FROM table1 WHERE col3 = _value
UNION ALL
SELECT col1, col2 FROM table2 WHERE col3 = _value
LIMIT 1;

$func$ LANGUAGE sql;
  • 如果参数在唯一列上并且保证单行

  • 在旧版本中,您需要对 SQL 函数中的参数使用位置引用。即:$1 而不是正文中的 _value。 (您仍然可以在函数头中使用 name the parameter,这对于记录和调用命名参数很有用。)

  • 没有括号,LIMIT 1 适用于整个查询,而不仅仅是最后一段。没有 ORDER BY!在外部查询中,Postgres 调用每个 SELECT 直到返回足够的行以满足 LIMIT 子句。如果您为查询运行 ANALYZE,您将看到 UNION 查询的剩余部分“从未执行”。

相关回答:

关于sql - 如果在 table1 中找不到记录,则从 table2 中选择的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24849366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com