postgresql Несколько идентичных условий объединены в один параметр - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть один sql, которому нужно преобразовать строковый столбец в массив, и мне нужно отфильтровать по этому столбцу , sql, например, так:

select
    parent_line,
    string_to_array(parent_line, '-')
from
    bx_crm.department
where
    status = 0 and
    '851' = ANY(string_to_array(parent_line, '-')) and
    array_length(string_to_array(parent_line, '-'), 1) = 5;

parent_line - это столбец varchar (50) In данные в этом виде, как 0-1-851-88

вопрос:

string_to_array(parent_line, '-') появляются много раз в моем sql.

  1. сколько раз string_to_array(parent_line) вычисляется в каждой строке. один или три раза
  2. как преобразовать string_to_array(parent_line) в параметр. наконец, мой sql может понравиться так:
depts = string_to_array(parent_line, '-')

select
    parent_line,
    depts
from
    bx_crm.department
where
    status = 0 and
    '851' = ANY(depts) and
    array_length(depts, 1) = 5;

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Postgres поддерживает боковые соединения, которые могут упростить эту логику c:

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)
0 голосов
/ 14 апреля 2020

Использовать производную таблицу:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...