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
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:
-
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
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
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