首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL自定义函数不按预期返回数据,方法是匹配我的条件。

SQL自定义函数不按预期返回数据,方法是匹配我的条件。
EN

Stack Overflow用户
提问于 2022-03-25 07:56:12
回答 1查看 56关注 0票数 0

我正在尝试创建这个函数,但是空值失败。

代码语言:javascript
复制
CREATE OR REPLACE function func(inspection_date date, strike_time date, taskaction_display varchar, last_known_status varchar, severity int)
RETURNS TABLE(last_known_task_status varchar, taskaction int) AS $$
    SELECT CASE
        WHEN inspection_date IS null THEN (taskaction_display, severity)
        WHEN strike_time >= inspection_date THEN (taskaction_display, severity)
        WHEN ((strike_time BETWEEN inspection_date - INTERVAL '6' MONTH AND inspection_date) AND last_known_status IS NOT null) THEN (last_known_status, 
             CASE
                WHEN last_known_status = 'IN_PROGRESS' THEN 11
                WHEN last_known_status = 'PENDING' THEN 12
                WHEN last_known_status = 'COMPLETE' THEN 13
                WHEN last_known_status = '' THEN -1
                ELSE -2
             END)
        WHEN ((strike_time BETWEEN inspection_date::date - INTERVAL '6' MONTH AND inspection_date) AND last_known_status IS null) THEN ('REVIEWED'::text, -3)
        WHEN (strike_time < inspection_date - INTERVAL '6' MONTH) THEN ('REVIEWED'::text, -2)
        ELSE ('NO MATCH'::text, -4)
    END
$$
language sql stable;

但是,有些条件不起作用,特别是当我传递空调用时,没有给出预期结果的情况是:

代码语言:javascript
复制
SELECT * FROM func('2022-03-22', '2022-01-22',
'strike in six months before inspection + last_known_status = null',
null, 20)

在我一无所获的时候,我期待着返回(“复习”,-2)。

代码语言:javascript
复制
SELECT * FROM func(null, '2021-01-22',
'strike time older than inspection date by more than 6 months but inspection_date is null',
'IS_NULL', 11)

当我什么都没得到的时候,我期待着返回(,-2)。

代码语言:javascript
复制
SELECT * FROM func('2022-03-22', '2021-01-22',
'strike in six months before inspection + last_known_status = IN_PROGRESS',
'IN_PROGRESS', 20)

期望在我得到(“没有匹配”,-4)时返回('IN_PROGRESS',11)。

简单地说,以下是我试图实现的SQL函数

代码语言:javascript
复制
func(inspection date, strike date, action varchar, status varchar, severity int)

并根据条件返回以下内容

代码语言:javascript
复制
if(inspection == null) return (action, severity)
else if(strike >= inspection) return (action, severity)
else if(strike >= inspection-6 months) {
    if(status == null) return ('REVIEWED', -1)
    else if(status == 'IN_PROGRESS') return (status, 11)
    else if(status == 'PENDING') return (status, 12)
    else if(status == 'COMPLETE') return (status, 13)
    else ('NO STATUS MATCH', -2)
}
else if(strike < inspection-6 months) return ('REVIEWED', -3)
else return ('NO MATCH', -4)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-25 09:53:32

我只解释的情况。您的代码按预期工作。如果你不确定。只需复制粘贴所有工作在sql小提琴。

代码语言:javascript
复制
SELECT * FROM func(null, '2021-01-22',
'strike time older than inspection date by more than 6 months but inspection_date is null',
'IS_NULL', 11)

会回来

代码语言:javascript
复制
                               last_known_task_status                                  | taskaction
------------------------------------------------------------------------------------------+------------
 strike time older than inspection date by more than 6 months but inspection_date is null |         11

因为:此执行满足谓词:

代码语言:javascript
复制
WHEN inspection_date IS null THEN (taskaction_display, severity)

代码语言:javascript
复制
SELECT * FROM func('2022-03-22', '2022-01-22',
'strike in six months before inspection + last_known_status = null',
null, 20);

会得到

代码语言:javascript
复制
 last_known_task_status | taskaction
------------------------+------------
 REVIEWED               |         -2

因为它满足谓词

代码语言:javascript
复制
WHEN ((strike_time BETWEEN inspection_date::date - INTERVAL '6' MONTH AND inspection_date)
                  AND last_known_status IS null) THEN ('REVIEWED'::text, -2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71613680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档