我有一个以下查询,其中我重用逻辑将时间戳转换为一种统一形式。我的记录中日期列类似于 varchar '2023-12-28',时间戳为 varchars '1646376986'。
我用以下方式解析它们:
case
when
conclusion_date ~ '^\d{4}-\d{2}-\d{2}$'
then
conclusion_date
else
to_char(to_timestamp(conclusion_date::numeric), 'YYYY-MM-DD')
end as conclusion_date
相同的逻辑重复了 3 次,我担心性能和资源问题是否有更好的方法来重用此逻辑?
SELECT id,
case
when
conclusion_date ~ '^\d{4}-\d{2}-\d{2}$'
then
conclusion_date
else
to_char(to_timestamp(conclusion_date::numeric), 'YYYY-MM-DD')
end as conclusion_date,
object_name,
request_id,
street,
industry_id,
object_type_name,
category_id
from ergrequests
WHERE and (object_name ILIKE '%' || COALESCE(@object_name, '') || '%')
and (industry_id = @industry_id or 0 = @industry_id)
and (case
when
conclusion_date ~ '^\d{4}-\d{2}-\d{2}$'
then
conclusion_date
else
to_char(to_timestamp(conclusion_date::numeric), 'YYYY-MM-DD')
end)::timestamp between
case
when @date_from = '' then '2019-01-01'::timestamp
else @date_from::timestamp
end and
case
when @date_to = '' then CURRENT_TIMESTAMP
else @date_to::timestamp
end
order by to_timestamp(
case
when
conclusion_date ~ '^\d{4}-\d{2}-\d{2}$'
then
conclusion_date
else
to_char(to_timestamp(conclusion_date::numeric), 'YYYY-MM-DD')
end,
'YYYY-MM-DD HH24:MI:SS.US'
)
offset $1 limit $2;
使用 CTE,然后在 SELECT 查询中使用它,如下所示:
-- USE CTE
WITH CTE AS (
SELECT id,
case
when
conclusion_date ~ '^\d{4}-\d{2}-\d{2}$'
then
conclusion_date
else
to_char(to_timestamp(conclusion_date::numeric), 'YYYY-MM-DD')
end as conclusion_date,
object_name,
request_id,
street,
industry_id,
object_type_name,
category_id
from ergrequests
WHERE and (object_name ILIKE '%' || COALESCE(@object_name, '') || '%')
and (industry_id = @industry_id or 0 = @industry_id)
)
SELECT * FROM CTE -- SELECT FROM CTE AND USE THE conclusion_date
WHERE conclusion_date::timestamp between
case
when @date_from = '' then '2019-01-01'::timestamp
else @date_from::timestamp
end and
case
when @date_to = '' then CURRENT_TIMESTAMP
else @date_to::timestamp
end
order by to_timestamp(
conclusion_date,
'YYYY-MM-DD HH24:MI:SS.US'
)
offset $1 limit $2;
请注意,这并不能保证良好的性能,但是,查询的复杂性会降低。