Написал запрос в pgAdmin — PostgreSQL
SELECT * FROM «user»;
WHERE user_age < 25;
Ругается на вторую строчку с ошибкой ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: «WHERE»), если заменить WHERE на ORDER BY скажем, точно такая же история.
Если убрать строчку WHERE user_age < 25; то запрос отрабатывает нормально
задан 1 июл 2020 в 9:47
2
Select .. from .. where
это одна инструкция и ;
там не нужна внутри инструкции
ответ дан 1 июл 2020 в 9:53
Aziz UmarovAziz Umarov
22.4k2 золотых знака10 серебряных знаков32 бронзовых знака
Syntax errors are quite common while coding.
But, things go for a toss when it results in website errors.
PostgreSQL error 42601 also occurs due to syntax errors in the database queries.
At Bobcares, we often get requests from PostgreSQL users to fix errors as part of our Server Management Services.
Today, let’s check PostgreSQL error in detail and see how our Support Engineers fix it for the customers.
What causes error 42601 in PostgreSQL?
PostgreSQL is an advanced database engine. It is popular for its extensive features and ability to handle complex database situations.
Applications like Instagram, Facebook, Apple, etc rely on the PostgreSQL database.
But what causes error 42601?
PostgreSQL error codes consist of five characters. The first two characters denote the class of errors. And the remaining three characters indicate a specific condition within that class.
Here, 42 in 42601 represent the class “Syntax Error or Access Rule Violation“.
In short, this error mainly occurs due to the syntax errors in the queries executed. A typical error shows up as:
Here, the syntax error has occurred in position 119 near the value “parents” in the query.
How we fix the error?
Now let’s see how our PostgreSQL engineers resolve this error efficiently.
Recently, one of our customers contacted us with this error. He tried to execute the following code,
CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH m_ty_person AS (return query execute sql)
select name, count(*) from m_ty_person where name like '%a%' group by name
union
select name, count(*) from m_ty_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;
But, this ended up in PostgreSQL error 42601. And he got the following error message,
ERROR: syntax error at or near "return"
LINE 5: WITH m_ty_person AS (return query execute sql)
Our PostgreSQL Engineers checked the issue and found out the syntax error. The statement in Line 5 was a mix of plain and dynamic SQL. In general, the PostgreSQL query should be either fully dynamic or plain. Therefore, we changed the code as,
RETURN QUERY EXECUTE '
WITH m_ty_person AS (' || sql || $x$)
SELECT name, count(*)::int FROM m_ty_person WHERE name LIKE '%a%' GROUP BY name
UNION
SELECT name, count(*)::int FROM m_ty_person WHERE gender = 1 GROUP BY name$x$;
This resolved the error 42601, and the code worked fine.
[Need more assistance to solve PostgreSQL error 42601?- We’ll help you.]
Conclusion
In short, PostgreSQL error 42601 occurs due to the syntax errors in the code. Today, in this write-up, we have discussed how our Support Engineers fixed this error for our customers.
PREVENT YOUR SERVER FROM CRASHING!
Never again lose customers to poor server speed! Let us help you.
Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.
GET STARTED
var google_conversion_label = «owonCMyG5nEQ0aD71QM»;
Я в sql не очень разбираюсь, поэтому не ругайтесь, если что-то совсем простое спрашиваю.
Есть таблица recording с полем asrtist_credit. Я хочу выбрать все записи из recording, если artist_credit находится в списке получаемом из подзапроса.
Подзапрос выглядит примерно так
SQL | ||
|
В результате получаю список с artist_credit, по которым нужно найти соответствующие записи в таблице recording.
В общей сложности запрос выглядит так:
SQL | ||
|
Получаю ошибку:
{ error: ошибка синтаксиса (примерное положение: «WHERE»)
Я бы мог прилепить сюда еще третий INNER JOIN, т.к. все таблицы связаны:
recording.artist_credit <—> artist_credit.id <—> artist_credit_name.artist_credit, artist_credit_name.artist <—> artist.id
но тогда запрос идет очень долго. Записей в recording таблице больше 18млн, в artist — больше 1млн. Если слепить 3 INNER JOIN то запрос идет на секунды ~ 5-20секунд. Думал как это оптимизировать, решил может с подзапросом быстрее будет, сам подзапрос выполняется относительно быстро ~ 100-500 msec
Добавлено через 2 минуты
На этот WHERE ругается
Сообщение от WhatIsHTML
WHERE recording.artist_credit
* * * * * * IN
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Друзья, помогите разобраться с подстановкой параметров в конструктор запроса для PostgreSQL.
Следующие две строки генерируют одинаковый SQL, если проверять через rawSql, но, фактически, первый пример работает, а второй выдает ошибку.
Пример № 1
Код: Выделить всё
andWhere("INET '".$ip."' <<= [[allowed_ip]]")
Генерирует sql:
Код: Выделить всё
SELECT * FROM "table" WHERE INET '192.168.1.1' <<= "allowed_ip"
Генерирует rawSql:
Код: Выделить всё
SELECT * FROM "table" WHERE INET '192.168.1.1' <<= "allowed_ip"
И этот код работает, если применить методы выборки, например ->all().
Но такой синтаксис неверен с точки зрения безопасности. Поэтому $ip был вынесен в параметры вот так:
Пример № 2
Код: Выделить всё
andWhere("INET :ip <<= [[allowed_ip]]", [':ip' => $ip])
Генерирует sql:
Код: Выделить всё
SELECT * FROM "table" WHERE INET :ip <<= "allowed_ip"
Генерирует rawSql:
Код: Выделить всё
SELECT * FROM "table" WHERE INET '192.168.1.1' <<= "allowed_ip"
И при этом не работает, вызывая исключение (строка очень длинная, листайте вправо до упора):
Код: Выделить всё
{
"name": "Database Exception",
"message": "SQLSTATE[42601]: Syntax error: 7 ОШИБКА: ошибка синтаксиса (примерное положение: "$1")nLINE 1: SELECT * FROM "table" WHERE INET $1 <<= "allowed...n ^nThe SQL being executed was: SELECT * FROM "table" WHERE INET '192.168.1.1' <<= "allowed_ip"",
"code": 42601,
"type": "yiidbException",
"file": "/app/vendor/yiisoft/yii2/db/Schema.php",
"line": 636,
|
|
|
информация о разделе
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных — обсуждаем в разделе «Базы данных: общие вопросы». Убедительная просьба — соблюдать «Правила форума» и не пренебрегать «Правильным оформлением своих тем». Прежде, чем создавать тему, имеет смысл заглянуть в раздел «Базы данных: FAQ», возможно там уже есть ответ. |
UPDATE SELECT
, PostgreSQL 9.4
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Senior Member Рейтинг (т): 13 |
create table t1 (id integer, f1 integer, f2 integer); create table t2 (f1 integer, f2 integer); update t1 set (f1, f2) = (select t2.f1, t2.f2 from t1 right join t2 on t1.id = t2.f1);
[Err] ОШИБКА: ошибка синтаксиса (примерное положение: «SELECT») |
grgdvo |
|
Member Рейтинг (т): 21 |
какая версия PG у вас?? Такой синтаксис только начиная с 9.5 |
HighMan |
|
Senior Member Рейтинг (т): 13 |
Цитата grgdvo @ 22.03.16, 20:20
Я в топе указал, что PostgreSQL 9.4. |
MIF |
|
Попробуй такой запрос:
update t1 set t1.f1= t2.f1, t1.f2 = t2.f2 from t1 right join t2 on t1.id = t2.f1 |
grgdvo |
|
Member Рейтинг (т): 21 |
MIF, t1 нельзя указывать и под UPDATE и под FROM. HighMan, попробуйте вот так, вроде эквивалентно
update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 where t1.id = t2.f1; |
HighMan |
|
Senior Member Рейтинг (т): 13 |
update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 where t1.id = t2.f1; Такой способ работает, но я не представляю как подобным запросом обрабатывать связи таблиц источников. |
grgdvo |
|
Member Рейтинг (т): 21 |
Вы можете делать JOIN практически также как в SELECT. Например
update t1 set (f1, f2) = (t2.f1, t2.f2) from t2, t3 where t1.id = t2.f1 and t2.f2 = t3.id;
update t1 set (f1, f2) = (t2.f1, t2.f2) from t2 left join t3 on t2.f2 = t3.id where t1.id = t2.f1; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Базы данных: SQL
- Следующая тема
[ Script execution time: 0,0779 ] [ 15 queries used ] [ Generated: 30.01.23, 16:30 GMT ]
when I am using this command to update table in PostgreSQL 13:
UPDATE rss_sub_source
SET sub_url = SUBSTRING(sub_url, 1, CHAR_LENGTH(sub_url) - 1)
WHERE sub_url LIKE '%/'
limit 10
but shows this error:
SQL Error [42601]: ERROR: syntax error at or near "limit"
Position: 111
why would this error happen and what should I do to fix it?
asked Jul 22, 2021 at 14:09
1
LIMIT
isn’t a valid keyword in an UPDATE
statement according to the official PostgreSQL documentation:
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Reference: UPDATE (PostgreSQL Documentation )
Solution
Remove LIMIT 10
from your statement.
answered Jul 22, 2021 at 14:32
John K. N.John K. N.
15.7k10 gold badges45 silver badges100 bronze badges
0
You could make something like this
But a Limit without an ORDER BY makes no sense, so you must choose one that gets you the correct 10 rows
UPDATE rss_sub_source t1
SET t1.sub_url = SUBSTRING(t1.sub_url, 1, CHAR_LENGTH(t1.sub_url) - 1)
FROM (SELECT id FROM rss_sub_source WHERE sub_url LIKE '%/' ORDER BY id LIMIT 10) t2
WHERE t2.id = t1.id
answered Jul 22, 2021 at 14:51
nbknbk
7,7295 gold badges12 silver badges27 bronze badges
when I am using this command to update table in PostgreSQL 13:
UPDATE rss_sub_source
SET sub_url = SUBSTRING(sub_url, 1, CHAR_LENGTH(sub_url) - 1)
WHERE sub_url LIKE '%/'
limit 10
but shows this error:
SQL Error [42601]: ERROR: syntax error at or near "limit"
Position: 111
why would this error happen and what should I do to fix it?
asked Jul 22, 2021 at 14:09
1
LIMIT
isn’t a valid keyword in an UPDATE
statement according to the official PostgreSQL documentation:
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Reference: UPDATE (PostgreSQL Documentation )
Solution
Remove LIMIT 10
from your statement.
answered Jul 22, 2021 at 14:32
John K. N.John K. N.
15.7k10 gold badges45 silver badges100 bronze badges
0
You could make something like this
But a Limit without an ORDER BY makes no sense, so you must choose one that gets you the correct 10 rows
UPDATE rss_sub_source t1
SET t1.sub_url = SUBSTRING(t1.sub_url, 1, CHAR_LENGTH(t1.sub_url) - 1)
FROM (SELECT id FROM rss_sub_source WHERE sub_url LIKE '%/' ORDER BY id LIMIT 10) t2
WHERE t2.id = t1.id
answered Jul 22, 2021 at 14:51
nbknbk
7,7295 gold badges12 silver badges27 bronze badges
Akopoff 5 / 4 / 1 Регистрация: 20.12.2022 Сообщений: 9 |
||||
1 |
||||
03.04.2023, 20:37. Показов 390. Ответов 3 Метки нет (Все метки)
При вызове такого запроса, выдает ошибку: psycopg2.errors.SyntaxError: ОШИБКА: ошибка синтаксиса (примерное положение: «WHERE») * во все пременные и ? кладутся корректные значения
0 |
1218 / 942 / 374 Регистрация: 02.09.2012 Сообщений: 2,870 |
|
03.04.2023, 21:57 |
2 |
Сообщение было отмечено Akopoff как решение Решение
* во все пременные и ? кладутся корректные значения Вы проверяли?!
0 |
Модератор 8507 / 5664 / 2293 Регистрация: 21.01.2014 Сообщений: 24,323 Записей в блоге: 3 |
|
06.04.2023, 12:17 |
3 |
Сообщение было отмечено Akopoff как решение Решение
кладутся корректные значения Ничего никуда не «кладется». Вам же даже в сообщении об ошибке написано, что как были в тексте запроса знаки вопроса, так и остались.
0 |
5 / 4 / 1 Регистрация: 20.12.2022 Сообщений: 9 |
|
07.04.2023, 20:08 [ТС] |
4 |
Да, ошибка была в этом. Перепутал с sqlite. Там в свою очередь вместо %s — ?. Спасибо
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.04.2023, 20:08 |
4 |
У меня есть следующий подготовленный запрос и его последующее извлечение
postgreSQL_select_Query = "UPDATE %s SET %s = %s WHERE %s = %s"
cursor.execute(postgreSQL_select_Query, (table,sql_attr,sql,id_attr,id,))
При извлечении я получаю такую ошибку:
psycopg.errors.SyntaxError: ошибка синтаксиса (примерное положение: "$1")
LINE 1: UPDATE $1 SET $2 = $3 WHERE $4 = $5
Не понимаю, почему ошибка выглядит так. С подстановкой только id работает.
Я практически уверен, что таблицу и атрибут нельзя сделать динамическими в запросе, но я не могу понять почему такая ошибка. Ведь даже значение не подставилось.
P.s библиотека используется следующая — psycopg
Syntax errors are quite common while coding.
But, things go for a toss when it results in website errors.
PostgreSQL error 42601 also occurs due to syntax errors in the database queries.
At Bobcares, we often get requests from PostgreSQL users to fix errors as part of our Server Management Services.
Today, let’s check PostgreSQL error in detail and see how our Support Engineers fix it for the customers.
What causes error 42601 in PostgreSQL?
PostgreSQL is an advanced database engine. It is popular for its extensive features and ability to handle complex database situations.
Applications like Instagram, Facebook, Apple, etc rely on the PostgreSQL database.
But what causes error 42601?
PostgreSQL error codes consist of five characters. The first two characters denote the class of errors. And the remaining three characters indicate a specific condition within that class.
Here, 42 in 42601 represent the class “Syntax Error or Access Rule Violation“.
In short, this error mainly occurs due to the syntax errors in the queries executed. A typical error shows up as:
Here, the syntax error has occurred in position 119 near the value “parents” in the query.
How we fix the error?
Now let’s see how our PostgreSQL engineers resolve this error efficiently.
Recently, one of our customers contacted us with this error. He tried to execute the following code,
CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH m_ty_person AS (return query execute sql)
select name, count(*) from m_ty_person where name like '%a%' group by name
union
select name, count(*) from m_ty_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;
But, this ended up in PostgreSQL error 42601. And he got the following error message,
ERROR: syntax error at or near "return"
LINE 5: WITH m_ty_person AS (return query execute sql)
Our PostgreSQL Engineers checked the issue and found out the syntax error. The statement in Line 5 was a mix of plain and dynamic SQL. In general, the PostgreSQL query should be either fully dynamic or plain. Therefore, we changed the code as,
RETURN QUERY EXECUTE '
WITH m_ty_person AS (' || sql || $x$)
SELECT name, count(*)::int FROM m_ty_person WHERE name LIKE '%a%' GROUP BY name
UNION
SELECT name, count(*)::int FROM m_ty_person WHERE gender = 1 GROUP BY name$x$;
This resolved the error 42601, and the code worked fine.
[Need more assistance to solve PostgreSQL error 42601?- We’ll help you.]
Conclusion
In short, PostgreSQL error 42601 occurs due to the syntax errors in the code. Today, in this write-up, we have discussed how our Support Engineers fixed this error for our customers.
PREVENT YOUR SERVER FROM CRASHING!
Never again lose customers to poor server speed! Let us help you.
Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.
GET STARTED
var google_conversion_label = «owonCMyG5nEQ0aD71QM»;