如何重用案例查询值?

问题描述 投票:0回答:1

我有一个以下查询,其中我重用逻辑将时间戳转换为一种统一形式。我的记录中日期列类似于 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;
sql postgresql timestamp case
1个回答
0
投票

使用 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;

请注意,这并不能保证良好的性能,但是,查询的复杂性会降低。

© www.soinside.com 2019 - 2024. All rights reserved.