我正在尝试根据当前日期生成支付期间值。当我运行以下查询时,它返回正确的支付期,但是我得到了另外的空行。如何摆脱空行?
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
我只想返回第二行。
答案 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');