Может показаться, что product_template.product_variant_ids
и sale_order_line.product_id
имеют несовместимый тип данных, один из integer
, а другой строковый (text
, varchar
, ...) - как указано в сообщении об ошибке .
Сделайте привычкой уточнять все имена столбцов в запросах, включающих несколько столбцов.
Судя по именам столбцов, product_id
- это integer
, а product_variant_ids
- это строковый тип, что, скорее всего, является ошибкой дизайна. Если он действительно содержит единственное допустимое целое число в строковом представлении, как предлагает ваш последний запрос, то, делая еще несколько предположений об ограничениях PK в вашей модели данных, ваш запрос может работать следующим образом:
SELECT pt.name
FROM sale_order so
JOIN sale_order_line sol ON sol.order_id = so.id
JOIN product_template pt ON pt.product_variant_ids::int = sol.product_id -- !
WHERE so.name = 'S00062'
AND NOT sol.product_id = 0; -- numeric literal without
Обратите внимание на приведение в целое число: product_variant_ids::int
. Но это всего лишь помада свинье. Столбец должен начинаться с типа integer
.
С другой стороны, имя product_variant_ids
указывает несколько значений, намекая на int[]
, массив целых чисел. Затем вам нужно сделать больше ...
Используйте нотацию JOIN
вместо вложения нескольких уровней x IN (subquery)
. Гораздо проще и обычно намного быстрее.
Оба идентичны, если подзапрос возвращает разные значения. В противном случае запись IN
сворачивает дубликаты, а соединения - нет. Это различие также делает x IN (subquery)
более сложным для внутреннего выполнения и, следовательно, более дорогим.
Наконец, столбец с именем product_variant_ids
обычно в любом случае указывает на ошибочный дизайн базы данных. Обычно в один столбец не помещается несколько значений. Если этот столбец имеет строковый тип поверх него, это двойное нет-нет. Вам нужно еще немного изучить реляционный дизайн и нормализацию базы данных.