postgresql将多个相同的条件统一为一个参数

postgresql将多个相同的条件统一为一个参数,sql,postgresql,Sql,Postgresql,我有一个sql需要将字符串列转换为数组,我必须使用此列进行筛选,sql如下: 选择 母系, 字符串到数组(父行“-”) 从…起 bx_客户关系管理部 哪里 状态=0和 “851”=任意(字符串到数组(父行“-”)和 数组长度(字符串到数组(父行“-”),1)=5; parent\u line是一个varchar(50)列,其中的数据类似于0-1-851-88 问题: 字符串到数组(父行“-”)在我的sql中多次出现 在每行中计算字符串到数组(父行)的次数。一次或三次 如何将字符串\u转换为\u

我有一个sql需要将字符串列转换为数组,我必须使用此列进行筛选,sql如下:

选择
母系,
字符串到数组(父行“-”)
从…起
bx_客户关系管理部
哪里
状态=0和
“851”=任意(字符串到数组(父行“-”)和
数组长度(字符串到数组(父行“-”),1)=5;
parent\u line
是一个varchar(50)列,其中的数据类似于0-1-851-88

问题:

字符串到数组(父行“-”)
在我的sql中多次出现

  • 在每行中计算字符串到数组(父行)的次数。一次或三次
  • 如何将
    字符串\u转换为\u数组(父\u行)
    转换为参数。最后,我的sql可能是这样的:
  • depts=字符串到数组(父行“-”)
    选择
    母系,
    部门
    从…起
    bx_客户关系管理部
    哪里
    状态=0和
    “851”=任何(部门)和
    数组长度(depts,1)=5;
    
    使用派生表:

    select *
    from (
      select parent_line, 
             string_to_array(parent_line, '-') as parents,
             status, 
             ... other columns ...
      from bx_crm.department
    ) x
    where status = 0
      and cardinality(parents) = 5
      and '851' = any(parents)
    

    Postgres支持横向连接,可简化此逻辑:

    select parent_line, v.parents, status,  ... other columns ...
    from bx_crm.department d cross join lateral
         (values (string_to_array(parent_line, '-')) v(parents)
    where d.status = 0 and
          cardinality(v.parents) = 5
          '851' = any(v.parents)