Ошибка синтаксиса примерное положение where

Написал запрос в pgAdmin — PostgreSQL
SELECT * FROM «user»;
WHERE user_age < 25;

Ругается на вторую строчку с ошибкой ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: «WHERE»), если заменить WHERE на ORDER BY скажем, точно такая же история.
Если убрать строчку WHERE user_age < 25; то запрос отрабатывает нормально введите сюда описание изображения

задан 1 июл 2020 в 9:47

lmageo's user avatar

2

Select .. from .. where это одна инструкция и ; там не нужна внутри инструкции

ответ дан 1 июл 2020 в 9:53

Aziz Umarov's user avatar

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
1
2
3
4
5
SELECT artist_credit.id
                    FROM artist
                        INNER JOIN artist_credit_name ON artist.id = artist_credit_name.artist
                        INNER JOIN artist_credit ON artist_credit_name.artist_credit = artist_credit.id
                        WHERE artist.id = '5845'

В результате получаю список с artist_credit, по которым нужно найти соответствующие записи в таблице recording.

В общей сложности запрос выглядит так:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
            
            FROM recording 
            WHERE recording.artist_credit 
            IN (
                SELECT ARRAY (
                    ПОДЗАПРОС
                )
            )                   
            
            WHERE recording.id > 0
            ORDER BY recording.id
            LIMIT 100;

Получаю ошибку:
{ 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,

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    информация о разделе

    user posted image Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных — обсуждаем в разделе «Базы данных: общие вопросы». Убедительная просьба — соблюдать «Правила форума» и не пренебрегать «Правильным оформлением своих тем». Прежде, чем создавать тему, имеет смысл заглянуть в раздел «Базы данных: FAQ», возможно там уже есть ответ.

    >
    UPDATE SELECT
    , PostgreSQL 9.4

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    22.03.16, 12:19

      Senior Member

      ****

      Рейтинг (т): 13

      ExpandedWrap disabled

        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»)
      LINE 2: (SELECT
      ^
      Я никак не могу сообразить, как правильно обновлять значения в таблице на основании результатов SELECT .. FROM .. JOIN.
      Подскажите пожалуйста! :wall:


      grgdvo



      Сообщ.
      #2

      ,
      22.03.16, 20:20

        Member

        **

        Рейтинг (т): 21

        какая версия PG у вас?? Такой синтаксис только начиная с 9.5


        HighMan



        Сообщ.
        #3

        ,
        23.03.16, 07:09

          Senior Member

          ****

          Рейтинг (т): 13

          Цитата grgdvo @ 22.03.16, 20:20

          Я в топе указал, что PostgreSQL 9.4.
          Печально, что вышеприведенная конструкция работает лишь с 9.5.
          Но должна же быть схожая конструкция для младших версий.
          Вариант с where = (SELECT …) не интересен.
          Нужно обновление таблицы данными и по условию выборки из других таблиц.

          Master

          MIF



          Сообщ.
          #4

          ,
          23.03.16, 08:31

            Попробуй такой запрос:

            ExpandedWrap disabled

              update t1

              set t1.f1= t2.f1,

              t1.f2 =  t2.f2

              from t1

              right join t2 on t1.id = t2.f1


            grgdvo



            Сообщ.
            #5

            ,
            23.03.16, 12:10

              Member

              **

              Рейтинг (т): 21

              MIF, t1 нельзя указывать и под UPDATE и под FROM.

              HighMan, попробуйте вот так, вроде эквивалентно

              ExpandedWrap disabled

                update t1 set (f1, f2) = (t2.f1, t2.f2)

                from t2 where t1.id = t2.f1;


              HighMan



              Сообщ.
              #6

              ,
              23.03.16, 18:21

                Senior Member

                ****

                Рейтинг (т): 13

                ExpandedWrap disabled

                  update t1 set (f1, f2) = (t2.f1, t2.f2)

                  from t2 where t1.id = t2.f1;

                Такой способ работает, но я не представляю как подобным запросом обрабатывать связи таблиц источников.


                grgdvo



                Сообщ.
                #7

                ,
                23.03.16, 20:16

                  Member

                  **

                  Рейтинг (т): 21

                  Вы можете делать JOIN практически также как в SELECT. Например

                  ExpandedWrap disabled

                    update t1 set (f1, f2) = (t2.f1, t2.f2)

                    from t2, t3 where t1.id = t2.f1 and t2.f2 = t3.id;

                  ExpandedWrap disabled

                    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
                  • Следующая тема

                  Рейтинг@Mail.ru

                  [ 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

                  Dolphin's user avatar

                  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.

                  a_horse_with_no_name's user avatar

                  answered Jul 22, 2021 at 14:32

                  John K. N.'s user avatar

                  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

                  nbk's user avatar

                  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

                  Dolphin's user avatar

                  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.

                  a_horse_with_no_name's user avatar

                  answered Jul 22, 2021 at 14:32

                  John K. N.'s user avatar

                  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

                  nbk's user avatar

                  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

                  Метки нет (Все метки)


                  Студворк — интернет-сервис помощи студентам

                  Python
                  1
                  
                  query = f"UPDATE {table} SET {column} = ? WHERE phone = ?;"

                  При вызове такого запроса, выдает ошибку:

                  psycopg2.errors.SyntaxError: ОШИБКА: ошибка синтаксиса (примерное положение: «WHERE»)
                  LINE 1: UPDATE residents SET user_id = ? WHERE phone = ?;

                  * во все пременные и ? кладутся корректные значения



                  0



                  1218 / 942 / 374

                  Регистрация: 02.09.2012

                  Сообщений: 2,870

                  03.04.2023, 21:57

                  2

                  Лучший ответ Сообщение было отмечено Akopoff как решение

                  Решение

                  Цитата
                  Сообщение от Akopoff
                  Посмотреть сообщение

                  * во все пременные и ? кладутся корректные значения

                  Вы проверяли?!
                  По форме вашего сообщения об ошибке как раз очень похоже, что в базу приходят как раз «вопросы», вместо реальных данных.
                  Насколько я помню python, префикс «f» означает форматированную строку, а и там подстановка делается через фигурные скобки, а не через вопросики (где вы это взяли?)
                  https://docs.python.org/3/tuto… g-literals



                  0



                  Модератор

                  8507 / 5664 / 2293

                  Регистрация: 21.01.2014

                  Сообщений: 24,323

                  Записей в блоге: 3

                  06.04.2023, 12:17

                  3

                  Лучший ответ Сообщение было отмечено Akopoff как решение

                  Решение

                  Цитата
                  Сообщение от 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»;

                • Ошибка синтаксиса примерное положение from
                • Ошибка синтаксиса примерное положение foreign
                • Ошибка синтаксиса примерное положение drop
                • Ошибка синтаксиса примерное положение create
                • Ошибка синтаксиса примерное положение begin