Ошибка столбец имеет тип integer а выражение character varying

I have prepared sql statement:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Result:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Next I create values list, set parameters and execure insert query:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

I got an error:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Something is wrong with article_id. I put it as string here. However when I manually try this query in PostgreSQL everything works(((

I have prepared sql statement:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Result:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Next I create values list, set parameters and execure insert query:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

I got an error:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Something is wrong with article_id. I put it as string here. However when I manually try this query in PostgreSQL everything works(((

I have prepared sql statement:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Result:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Next I create values list, set parameters and execure insert query:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

I got an error:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Something is wrong with article_id. I put it as string here. However when I manually try this query in PostgreSQL everything works(((

I have prepared sql statement:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Result:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Next I create values list, set parameters and execure insert query:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

I got an error:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Something is wrong with article_id. I put it as string here. However when I manually try this query in PostgreSQL everything works(((

I have prepared sql statement:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Result:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Next I create values list, set parameters and execure insert query:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

I got an error:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Something is wrong with article_id. I put it as string here. However when I manually try this query in PostgreSQL everything works(((

ERROR: Operator does not exist: character varying = integer

Getting an error Operator does not exist: character varying = integer when executing an insight

Boyan Barnev avatar

Written by Boyan Barnev

Updated over a week ago

Problem

You created an SQL insight and when you execute it (or save it and view it) you get an error message stating: ERROR: Operator does not exist: character varying = integer

Cause

The above error means that somewhere in your insight you are trying to compare a text string to a numeric value. SQL can’t directly recognize the text as number, thus the comparison is not possible.

You can easily identify if that’s the case if you do a SELECT statement for the fields you want to use in your insight and observe their output by clicking the Execute button in your insight editor. If the value is surrounded in quotation marks, then it’s coming through as a text. If it’s not, then it’s numeric.

Here are two examples:

  1. In the below example, the values of the id and week fields are coming through as text:

{
"data_source_id": "5ec29e7c53e7610001d5f1be",
"id": "4",
"sync_date": "2020-06-25T00:00:00",
"week": "3"
}

2. In this example, the values of the id and week fields are coming through as numeric:

{
"data_source_id": "5ec29e7c53e7610001d5f1be",
"id": 4,
"sync_date": "2020-06-25T00:00:00",
"week": 3
}

Solution

If you must compare the values you’re extracting against numeric values, you have to cast your fields and specify the desired format. For example:

SELECT week FROM my_table WHERE id::int=4

instructs SQL to interpret the value in the id field as integer, and enables you to compare it to an integer value.

Additional information

  • In this article we use the :: operator to cast to a numeric type. You can read more about it here: PostgreSQL numeric data types

Google Chrome 59.0.3071.115
Ubuntu 17.04
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit

  • Metabase version: 0.25.1
  • Metabase hosting environment: Docker
  • Metabase internal database: H2

SELECT COUNT("order".order_id) AS sclr_0, TO_CHAR("order".created_at, 'YYYY-MM-DD') AS sclr_1 FROM "order" where {{created_at}} AND {{restaurant}} GROUP BY sclr_1;

restaurant variable -> Widget: id

ERROR: operator does not exist: integer = character varying Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. Position: 331

Logs

Jul 28 16:27:32 WARN metabase.query-processor :: {:status :failed,
:class java.lang.Exception,
:error «ERROR: operator does not exist: integer = character varyingn Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.n Position: 275»,
:stacktrace
[«driver.generic_sql.query_processor$do_with_try_catch.invokeStatic(query_processor.clj:349)»
«driver.generic_sql.query_processor$do_with_try_catch.invoke(query_processor.clj:345)»
«driver.generic_sql.query_processor$execute_query.invokeStatic(query_processor.clj:396)»
«driver.generic_sql.query_processor$execute_query.invoke(query_processor.clj:392)»
«driver$fn__22473$G__22466__22480.invoke(driver.clj:45)»
«query_processor$execute_query.invokeStatic(query_processor.clj:49)»
«query_processor$execute_query.invoke(query_processor.clj:43)»
«query_processor.middleware.mbql_to_native$mbql__GT_native$fn__26496.invoke(mbql_to_native.clj:30)»
«query_processor.middleware.annotate_and_sort$annotate_and_sort$fn__25019.invoke(annotate_and_sort.clj:41)»
«query_processor.middleware.limit$limit$fn__26451.invoke(limit.clj:14)»
«query_processor.middleware.cumulative_aggregations$cumulative_aggregation$fn__26299.invoke(cumulative_aggregations.clj:46)»
«query_processor.middleware.cumulative_aggregations$cumulative_aggregation$fn__26299.invoke(cumulative_aggregations.clj:46)»
«query_processor.middleware.format_rows$format_rows$fn__26442.invoke(format_rows.clj:21)»
«query_processor.middleware.results_metadata$record_and_return_metadata_BANG_$fn__27720.invoke(results_metadata.clj:88)»
«query_processor.middleware.resolve$resolve_middleware$fn__24627.invoke(resolve.clj:329)»
«query_processor.middleware.expand$expand_middleware$fn__26193.invoke(expand.clj:536)»
«query_processor.middleware.add_row_count_and_status$add_row_count_and_status$fn__24711.invoke(add_row_count_and_status.clj:14)»
«query_processor.middleware.driver_specific$process_query_in_context$fn__26319.invoke(driver_specific.clj:12)»
«query_processor.middleware.resolve_driver$resolve_driver$fn__27730.invoke(resolve_driver.clj:14)»
«query_processor.middleware.cache$maybe_return_cached_results$fn__25099.invoke(cache.clj:146)»
«query_processor.middleware.catch_exceptions$catch_exceptions$fn__26241.invoke(catch_exceptions.clj:58)»
«query_processor$process_query.invokeStatic(query_processor.clj:124)»
«query_processor$process_query.invoke(query_processor.clj:120)»
«query_processor$run_and_save_query_BANG_.invokeStatic(query_processor.clj:232)»
«query_processor$run_and_save_query_BANG_.invoke(query_processor.clj:227)»
«query_processor$fn__27764$process_query_and_save_execution_BANG___27769$fn__27770.invoke(query_processor.clj:270)»
«query_processor$fn__27764$process_query_and_save_execution_BANG___27769.invoke(query_processor.clj:256)»
«api.card$run_query_for_card.invokeStatic(card.clj:491)»
«api.card$run_query_for_card.doInvoke(card.clj:477)»
«api.card$fn__29925$fn__29928$fn__29929.invoke(card.clj:498)»
«api.card$fn__29925$fn__29928.invoke(card.clj:497)»
«api.common.internal$do_with_caught_api_exceptions.invokeStatic(internal.clj:227)»
«api.common.internal$do_with_caught_api_exceptions.invoke(internal.clj:222)»
«api.card$fn__29925.invokeStatic(card.clj:493)»
«api.card$fn__29925.invoke(card.clj:493)»
«middleware$enforce_authentication$fn__28955.invoke(middleware.clj:122)»
«api.routes$fn__40133.invokeStatic(routes.clj:56)»
«api.routes$fn__40133.invoke(routes.clj:56)»
«routes$fn__40784$fn__40785.doInvoke(routes.clj:75)»
«routes$fn__40784.invokeStatic(routes.clj:71)»
«routes$fn__40784.invoke(routes.clj:71)»
«middleware$log_api_call$fn__29054$fn__29056.invoke(middleware.clj:331)»
«middleware$log_api_call$fn__29054.invoke(middleware.clj:330)»
«middleware$add_security_headers$fn__29004.invoke(middleware.clj:245)»
«middleware$bind_current_user$fn__28959.invoke(middleware.clj:142)»
«middleware$maybe_set_site_url$fn__29008.invoke(middleware.clj:268)»],
:query
{:type «native»,
:native
{:query «SELECT COUNT(«order».order_id) AS sclr_0, TO_CHAR(«order».created_at, ‘YYYY-MM-DD’) ASnsclr_1 FROM «order» where {{created_at}} [[AND {{restaurant}}]]nGROUP BY sclr_1;»,
:template_tags
{:created_at
{:id «431f6a38-455e-db5e-d862-59d6903b3242», :name «created_at», :display_name «Created at», :type «dimension», :required true, :dimension [«field-id» 166], :widget_type «date/range»},
:restaurant {:id «66ad5e09-0957-d8e2-d85f-30cab586024a», :name «restaurant», :display_name «Restaurant», :type «dimension», :dimension [«field-id» 181], :widget_type «id»}}},
:constraints {:max-results 10000, :max-results-bare-rows 2000},
:parameters [{:type «id», :target [«dimension» [«template-tag» «restaurant»]], :value «6»}],
:cache_ttl nil,
:info
{:executed-by 1,
:context :question,
:card-id 3,
:dashboard-id nil,
:query-hash [-49, -69, -67, 38, 55, -79, -44, 54, 54, -72, -75, -20, 71, -14, 52, -66, -89, -106, -38, 7, 42, 16, 27, 25, 122, 123, 24, -84, 42, 71, -116, -126],
:query-type «native»}},
:expanded-query nil}

Jul 28 16:27:32 WARN metabase.query-processor :: Query failure: ERROR: operator does not exist: integer = character varying
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 275
[«query_processor$assert_query_status_successful.invokeStatic(query_processor.clj:201)»
«query_processor$assert_query_status_successful.invoke(query_processor.clj:194)»
«query_processor$run_and_save_query_BANG_.invokeStatic(query_processor.clj:233)»
«query_processor$run_and_save_query_BANG_.invoke(query_processor.clj:227)»
«query_processor$fn__27764$process_query_and_save_execution_BANG___27769$fn__27770.invoke(query_processor.clj:270)»
«query_processor$fn__27764$process_query_and_save_execution_BANG___27769.invoke(query_processor.clj:256)»
«api.card$run_query_for_card.invokeStatic(card.clj:491)»
«api.card$run_query_for_card.doInvoke(card.clj:477)»
«api.card$fn__29925$fn__29928$fn__29929.invoke(card.clj:498)»
«api.card$fn__29925$fn__29928.invoke(card.clj:497)»
«api.common.internal$do_with_caught_api_exceptions.invokeStatic(internal.clj:227)»
«api.common.internal$do_with_caught_api_exceptions.invoke(internal.clj:222)»
«api.card$fn__29925.invokeStatic(card.clj:493)»
«api.card$fn__29925.invoke(card.clj:493)»
«middleware$enforce_authentication$fn__28955.invoke(middleware.clj:122)»
«api.routes$fn__40133.invokeStatic(routes.clj:56)»
«api.routes$fn__40133.invoke(routes.clj:56)»
«routes$fn__40784$fn__40785.doInvoke(routes.clj:75)»
«routes$fn__40784.invokeStatic(routes.clj:71)»
«routes$fn__40784.invoke(routes.clj:71)»
«middleware$log_api_call$fn__29054$fn__29056.invoke(middleware.clj:331)»
«middleware$log_api_call$fn__29054.invoke(middleware.clj:330)»
«middleware$add_security_headers$fn__29004.invoke(middleware.clj:245)»
«middleware$bind_current_user$fn__28959.invoke(middleware.clj:142)»
«middleware$maybe_set_site_url$fn__29008.invoke(middleware.clj:268)»]

Я подготовил оператор sql:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Результат:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Далее я создаю список значений, заданные параметры и выполняемое запрос вставки:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

У меня ошибка:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Что-то не так с article_id. Я поместил это здесь как строку. Однако когда я вручную пробую этот запрос в PostgreSQL, все работает (((

2 ответа

Лучший ответ

Для article_id вы должны использовать insert_query.setInteger вместо insert_query.setString. Когда я проверяю ваше исключение, article_id отправляется в БД в виде строки. Вот почему у вас есть это исключение.


4

JFPicard
26 Мар 2015 в 13:34

Лучшее решение, которое я нашел, — это инициировать список значений как:

ArrayList<Object> values = new ArrayList<Object>();

И вставить в объект оператора:

insert_query.setObject(i, values.get(i-1));


2

ovod
26 Мар 2015 в 13:52

Хочу сделать апдейт записи, если такая уже есть, а если

нет то записать в базу, но ловлю ошибку ОШИБКА: неоднозначная ссылка на столбец «endpoint_name». Как можно исправить, подскажите, плиз?
Мой запрос:
INSERT INTO endpoint_names (endpoint_id, endpoint_name)
VALUES (499, ‘something’)
ON CONFLICT (endpoint_id)
DO UPDATE SET endpoint_id = endpoint_name;

russian

programming

pgsql


4

ответов

попробуйте такой вариант с «excluded.endpoint_name»

INSERT INTO endpoint_names (endpoint_id, endpoint_name)
VALUES (499, ‘something’)
ON CONFLICT (endpoint_id)
DO UPDATE SET endpoint_id = excluded.endpoint_name;


Светлана Самкина

попробуйте такой вариант с «excluded.endpoint_na…

Видимо что-то не так со столбцом…
ОШИБКА: столбец «endpoint_id» имеет тип integer, а выражение — character varying


Artem

Видимо что-то не так со столбцом…
ОШИБКА: столб…

да-да. именно — только хотела написать об этом

в апдейте будет ошибка несоответствия типов

но excluded.endpoint_name сработает — если типы данных будут корректными


Светлана Самкина

да-да. именно — только хотела написать об этом

в …

Спасибо большое, буду разбираться!

I am creating a table in redshift using a default sysdate column However when I insert data I get a weird expression is of type character varying error. This is the first time I ever ran into this error.

CREATE TABLE IF NOT EXISTS shipments_swp
(
shipment_id                      bigint DISTKEY ENCODE RAW,
user_id                          bigint ENCODE ZSTD,
last_tracking_event_time         timestamp encode zstd,
bd_updated_at                    timestamp default sysdate ENCODE ZSTD
);

Insert into shipments_swp
(
select *
from common.shipments_dim
);

The error message is as shown

SQL Error [500310] [42804]: [Amazon](500310) Invalid operation: column "bd_updated_at" is of type timestamp without time zone but expression is of type character varying;

asked May 21, 2020 at 17:54

spak's user avatar

1

Can you post an example of the timestamp you’re trying to insert into that column? It’s possible that you need to cast that column as a timestamp before you write it to shipments_swp. I tried a simple test to see that the insert works correctly and I had no problem inserting to it:

CREATE TABLE IF NOT EXISTS test_table_a (
    ts_a    TIMESTAMP DEFAULT SYSDATE ENCODE ZSTD
);

-- Insert a few different date formats
insert into test_table_a values('2020/05/22');
insert into test_table_a values('2020-05-22');
insert into test_table_a values('2020-05-22 16:12:27.830728');
insert into test_table_a values('2020-05-22 16:06:00');

--- Create a second table and write to that 
--- to mimic the insert behavior from the question

CREATE TABLE IF NOT EXISTS test_table_b (
    ts_b    TIMESTAMP DEFAULT SYSDATE ENCODE ZSTD
);

INSERT INTO test_table_b (
    SELECT *
    FROM test_table_a
);

--- This insert succeeds
SELECT * FROM test_table_b;

2020-05-22 16:06:00
2020-05-22 00:00:00
2020-05-22 16:06:56.823844
2020-05-22 00:00:00

answered May 22, 2020 at 16:17

tanvi's user avatar

tanvitanvi

5682 gold badges11 silver badges31 bronze badges

Я подготовил оператор sql:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

Результат:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

Далее я создаю список значений, заданные параметры и выполняемое запрос вставки:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) {
            insert_query.setString(i, values.get(i-1));
        }
System.out.println(insert_query);
insert_query.executeUpdate();

У меня ошибка:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

Что-то не так с article_id. Я поместил это здесь как строку. Однако когда я вручную пробую этот запрос в PostgreSQL, все работает (((

2 ответа

Лучший ответ

Для article_id вы должны использовать insert_query.setInteger вместо insert_query.setString. Когда я проверяю ваше исключение, article_id отправляется в БД в виде строки. Вот почему у вас есть это исключение.


4

JFPicard
26 Мар 2015 в 13:34

Лучшее решение, которое я нашел, — это инициировать список значений как:

ArrayList<Object> values = new ArrayList<Object>();

И вставить в объект оператора:

insert_query.setObject(i, values.get(i-1));


2

ovod
26 Мар 2015 в 13:52

  • Ошибка столбец prokind не существует
  • Ошибка столбец none не существует
  • Ошибка столбец c relhasoids не существует символ 245
  • Ошибка стоила очень дорого
  • Ошибка студенчество отмечали начало каникул является