带有操作符的PostgreSQL案例返回空行

时间:2019-06-09 17:16:18

标签: sql postgresql

我正在尝试根据当前日期生成支付期间值。当我运行以下查询时,它返回正确的支付期,但是我得到了另外的空行。如何摆脱空行?

select  distinct case  when current_date >= to_date(begin_payperiod_date, 'mm/dd/yy') 
    and current_date < to_date(end_payperiod_date, 'mm/dd/yy') 
    then cast(regexp_replace(itc_pp, '[^0-9]*', '', 'g') as integer)-1  end AS current_pp
from    actacc.payperiod_conversion_all_years

当前它返回:

1 null
2 18

我只想返回第二行。

3 个答案:

答案 0 :(得分:0)

case逻辑移至where子句:

select (cast(regexp_replace(itc_pp, '[^0-9]*', '', 'g') as integer)-1) AS current_pp
from actacc.payperiod_conversion_all_years
where current_date >= to_date(begin_payperiod_date, 'mm/dd/yy') and
      current_date < to_date(end_payperiod_date, 'mm/dd/yy') ;

我删除了select distinct。您没有数据样本,因此尚不清楚是否有必要。如果是,则可以将其重新添加。

请注意,您应该使用正确的日期/时间数据类型而不是字符串存储日期。如果您这样做了,那么转换步骤将是不必要的。

答案 1 :(得分:0)

您应该使用where条件来过滤行:

select  distinct cast(regexp_replace(itc_pp, '[^0-9]+', '', 'g') as integer)-1 AS current_pp
from    actacc.payperiod_conversion_all_years
where current_date >= to_date(begin_payperiod_date, 'mm/dd/yy') 
  and current_date < to_date(end_payperiod_date, 'mm/dd/yy')

此外,匹配空字符串只是用空字符串再次替换也没有意义,因此我在您的正则表达式中将*更改为+

答案 2 :(得分:0)

在查询中,您仅定义了记录所属的CASE-

current_date >= to_date(begin_payperiod_date, 'mm/dd/yy')
AND current_date < to_date(end_payperiod_date, 'mm/dd/yy')

结果,超出该日期范围的所有记录都将返回NULL,因为如果日期超出该范围,您将不定义任何内容。您可以为该日期范围之外的记录定义一个ELSE部分。该脚本可以如下所示-

SELECT 
DISTINCT 
       CASE
           WHEN current_date >= to_date(begin_payperiod_date, 'mm/dd/yy')
                AND current_date < to_date(end_payperiod_date, 'mm/dd/yy') 
                THEN CAST(regexp_replace(itc_pp, '[^0-9]*', '', 'g') AS INTEGER) - 1
            ELSE itc_pp 
            -- Here you can keep the original value or do some 
            -- adjustment as per requirement to keep sync in values data type. 
       END AS current_pp
FROM actacc.payperiod_conversion_all_years; 

如果在where子句中添加日期过滤条件,则脚本应如下所示-

SELECT 
DISTINCT CAST(regexp_replace(itc_pp, '[^0-9]*', '', 'g') AS INTEGER) - 1 current_pp       
FROM actacc.payperiod_conversion_all_years
WHERE current_date >= to_date(begin_payperiod_date, 'mm/dd/yy')
AND current_date < to_date(end_payperiod_date, 'mm/dd/yy');