2017-02-16 2 views
0
SELECT * 
FROM lookup_type 
WHERE type_group = 'enquiry' 
    AND type_sub_group = 'category' 
    AND type_attribute IN (SELECT prod_id 
         FROM product 
         WHERE prod_id IN (SELECT option_prod_id 
              FROM product_option 
              WHERE option_id IN (SELECT link_option_id 
                   FROM product_link 
                   WHERE link_member_id = '146'))); 

В запросе выше я хотел бы выбрать запись в моей таблице поиска. Однако я получаю следующую ошибку от моего клиента postgreSQL.Понятие явного типа приведения в SQL

ERROR: operator does not exist: character varying = integer
LINE 1: ...uiry' and type_sub_group='category' and type_attr in(SELECT ...
^

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

type attr является varchar колонка и prod_id является целым числом столбца.

Что я делаю неправильно и как это исправить? Объяснение тому, как избежать этого в будущем, было бы высоко оценено.

+0

Почему вы сравниваете яблоки с апельсинами? На самом деле не имеет смысла, что один и тот же тип информации хранится как varchar в одной таблице и как целое число в другой таблице. –

ответ

2

PostgreSQL является сильно типизированных - каждое значение имеет определенный тип, и каждая функция и оператор определяется для работы с определенными типами.

Существует оператор для сравнения двух значений VarChar и другого оператора для сравнения двух значений Integer. Оба из них написаны =, но они являются отдельными записями в системном каталоге Postgres. Поскольку нет оператора с именем =, который принимает VarChar с одной стороны и Integer, с другой стороны, это объясняет сообщение «оператор не существует».

На практике эмпирическое правило состоит в том, что необходимо, чтобы обе стороны знака = были одного и того же типа, чтобы их можно было сравнить. Это можно сделать с помощью стандартной функции SQL CAST(value AS type), которая преобразует значение из одного типа в другой.

В этом случае, вы хотите, чтобы результаты от вашей внутренней SELECT всем быть VarChar s, так что они могут быть поданы в пункте IN, так что вы можете написать:

... and type_attribute in (SELECT CAST(prod_id as VarChar) ... 

Целое всегда можно отливать в строку, потому что вы всегда можете вывести число с помощью цифр. Если вы знаете, что строка будет содержать только цифры, вы также можете использовать другой способ, например. CAST(type_attribute AS int).

3

Вы проверяете type_attribute, который является полем varchar с целым числом i.e prod_id. Одна вещь, которую вы можете сделать, - это ввести cast prod_id в varchar в ваш запрос sub.

SELECT Cast(prod_id As varchar) 
1

Так у вас есть запрос, как это:

SELECT * 
    FROM lookup_type 
    WHERE type_group = 'enquiry' 
     and type_sub_group='category' 
     and type_attribute in (
      SELECT prod_id 
      FROM product 
      WHERE prod_id in (
       SELECT option_prod_id 
       FROM product_option 
       WHERE option_id in (
        SELECT link_option_id 
        FROM product_link 
        WHERE link_member_id = '146' 
        ) 
       ) 
      ); 

Начнет с внутренним запросом:

   SELECT link_option_id 
       FROM product_link 
       WHERE link_member_id = '146' 

Если link_option_id является integer, но option_id из верхнего гнезда является varchar, у вас будет проблема. Таким образом, вы должны cast результат и это нравится:

  SELECT cast(link_option_id,varchar) 
      FROM product_link 
      WHERE link_member_id = '146' 

Вы получаете его. Та же логика должна быть применена к гнездам.

Вот еще немного дополнительной информации о функции CAST (быстрый поиск Google): http://www.postgresqltutorial.com/postgresql-cast/

0

В PostgreSQL, можно заливать с помощью :: обозначения, например,

SELECT * 
FROM lookup_type 
WHERE type_group = 'enquiry' 
and type_sub_group='category' 
and type_attribute in (SELECT prod_id::varchar 
         FROM product 
         WHERE prod_id in (SELECT option_prod_id 
              FROM product_option 
              WHERE option_id in (SELECT link_option_id 
                   FROM product_link 
                   WHERE link_member_id = '146'))); 
Смежные вопросы