ОШИБКА: оператор не существует: логическое> числовое - PullRequest
0 голосов
/ 19 апреля 2020

Я попытался выполнить приведенный ниже запрос в сообществе postgres

select count(*) 
from cdar_cpms_owner.hshldgrp_wkly_actvty s 
where s.wk_id between (extract(isoyear from now()-interval '9 week')
   || trim(to_char(extract(week from now()-interval '9 week'),'09')))::numeric
  and s.wk_id > (extract(isoyear from now()-interval '2 week')
   || trim(to_char(extract(week from now()-interval '2 week'),'09')))::numeric

, для этого я получил ошибку:

ERROR:  operator does not exist: boolean > numeric
    LINE 2: and s.wk_id > (extract(isoyear from now()-interval '2 week')...
                        ^
    HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

Где тот же запрос работает нормально для корпоративной версии Postgres .

Может кто-нибудь предложить, какие изменения требуются в запросе, чтобы сделать его совместимым с версией сообщества postgres?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Выражение s.wk_id between (extract(isoyear from now()-interval '9 week') || trim(to_char(extract(week from now()-interval '9 week'),'09')))::numeric and s.wk_id является логическим.

Затем вы делаете > (extract...)::numeric против этого первого логического выражения. Я не вижу другого способа разобрать его, который был бы более правильным. Если AND является соединением, то ваш МЕЖДУ пропускает AND. Если AND принадлежит промежуточному элементу, то существует несоответствие типов. Пожалуйста, добавьте явные скобки, чтобы показать, как вы думаете, между, и, и > должны быть разделены.

0 голосов
/ 20 апреля 2020

Я сомневаюсь, что утверждение выполняется в EnterpriseDB:

select count(*) 
from cdar_cpms_owner.hshldgrp_wkly_actvty s 
where s.wk_id between (extract(isoyear from now()-interval '9 week')
   || trim(to_char(extract(week from now()-interval '9 week'),'09')))::numeric
  and s.wk_id > (extract(isoyear from now()-interval '2 week')
   || trim(to_char(extract(week from now()-interval '2 week'),'09')))::numeric; 

Если это так, то EnterpriseDB имеет серьезную проблему, поскольку это утверждение не имеет никакого смысла. Если вы разрешите только манипуляции с датой, используя 19-апрель-2020 как дату, вы сократите оператор до:

select count(*) 
  from cdar_cpms_owner.hshldgrp_wkly_actvty s 
 where s.wk_id between 202007 and s.wk_id > 202014;

Но при условии, что wk_id - это число c подвыражение "s.wk_id> 202014 "производит логическое значение, и результирующее где становится:

where s.wk_id between a numeric and a boolean

И это ЕСТЬ или, по крайней мере, должно быть недействительным. Возможно, ошибка была обнаружена и исправлена ​​в одной среде, но не в другой.

Решение удалите "s.wk_id>" из фазы AND предложения Между:

select count(*) 
  from cdar_cpms_owner.hshldgrp_wkly_actvty s 
    where s.wk_id between (extract(isoyear from now()-interval '9 week')
       || trim(to_char(extract(week from now()-interval '9 week'),'09')))::numeric
      and (extract(isoyear from now()-interval '2 week')
       || trim(to_char(extract(week from now()-interval '2 week'),'09')))::numeric; 

BTW get Год ISO и неделю ISO можно получить напрямую с помощью to_char в формате «iyyyiw». Таким образом, запрос становится (IMHO) более понятным (хотя я допускаю, что формат изначально выглядит странно):

select count(*) 
  from cdar_cpms_owner.hshldgrp_wkly_actvty s 
 where s.wk_id between to_char(now()-interval '9 week','iyyyiw')::numeric
                   and to_char(now()-interval '2 week','iyyyiw')::numeric;
0 голосов
/ 19 апреля 2020

Я не знаю ни одной корпоративной версии Postgres. Может быть, вы имеете в виду EnterpriseDB? Эта база данных старается быть более совместимой с Oracle, чем Postgres. Postgres - это база данных со строгим типом, Oracle - это база данных с допустимым типом. Больше Oracle не знает логический тип данных, есть только целые числа.

Сообщение об ошибке чисто - вы не можете сравнить логический тип данных с цифрой c. Странно, так что ваш s.wk_id логический - похоже на ошибку на вашей стороне. Вы можете легко исправить это явным приведением типа s.wk_id :: int, но это выглядит как полная чепуха. Вы должны проверить тип данных s.wk_id. Вероятно, это не должно быть boolean.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...