gpt4 book ai didi

sql-server - 来自 SQL Server 存储过程的 Postgresql 函数

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

我在 SQL Server 中有一个过程如下:

我正在尝试编写一个与上面完全相同的 postgresql 函数。我试过这样的事情:

CREATE OR REPLACE FUNCTION getadmbyyear(IN a integer, IN b character varying)
RETURNS TABLE(monname character varying, mon integer, adm integer, selected integer) AS
$BODY$

DECLARE testtypeid int;

select top 1 testtypeid := typeid from Reports_ReportMenu
where ID = $2

select MonName,Mon,Adm,
case when ROW_NUMBER() OVER(ORDER BY Mon,Adm) = '1' then
cast(1 as int) else cast(0 as int) end as Selected
from eivTestAdms
where test_type_id=testtypeid and "YR"=$1 and Adm is not null
order by Mon,Adm

$BODY$
LANGUAGE sql;

在这里,我在 int 的声明语句中遇到语法错误。我是否以正确的格式编写函数?

最佳答案

你不能在 SQL 函数中有变量,这些变量只有在使用 PL/pgSQL 时才可用。

但是无论如何都不需要变量。您可以将其放入子选择中。

另外 cast(1 as int) 是没用的。 1 已经是一个整数,0 也是一个整数,因此不需要转换。

CREATE OR REPLACE FUNCTION getadmbyyear(IN a integer, IN b character varying)
RETURNS TABLE(monname character varying, mon integer, adm integer, selected integer)
AS
$body$
select MonName,
Mon,
Adm,
case
when ROW_NUMBER() OVER (ORDER BY Mon,Adm) = 1 then 1
else 0
end as Selected
from eivTestAdms
where test_type_id = (select testtypeid
from Reports_ReportMenu
where ID = $2
limit 1)
and "YR"=$1
and Adm is not null
order by Mon,Adm;
$body$
language sql;

但是 SQL Server 的 bit 数据类型通常用作穷人的 bool 值。所以在 Postgres 中它应该是一个真正的 boolean。这使得 case 语句更短:

    select MonName, 
Mon,
Adm,
ROW_NUMBER() OVER (ORDER BY Mon,Adm) = 1 as selected -- this is a boolean expression that will return true or false
from eivTestAdms

然后您需要将函数签名调整为:

RETURNS TABLE(monname character varying, mon integer, adm integer, selected boolean) 

关于sql-server - 来自 SQL Server 存储过程的 Postgresql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732493/

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