@dfhkjhg

Почему не работает запрос с условием PostgreSQL?

Вот такой запрос надо проверить есть в таблице пользователь с определенным steamid если есть то обновить имя а если нету то добавить в таблицу

Не могу понять почему не работает

await pool.query(`IF (SELECT * FROM users WHERE steamid = $1) THEN
        UPDATE users SET name = $2 WHERE steamid = $1
        ELSE
        INSERT INTO users (balance, steamid, name, avatar) VALUES (0, $1, $2, $3)
        END IF;`, [ steamid, personaname, avatarhash ])
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
SQL не предполагает условных выражений, но вы можете обновить данные с помощью UPSERT. В PostgreSQL 9.5+ реализуется следующим образом:

CREATE TABLE users (
    steamid BIGINT PRIMARY KEY,
    balance DECIMAL NOT NULL,
    name VARCHAR(24) NOT NULL,
    avatar VARCHAR(2038) NOT NULL
);

INSERT INTO users (balance, steamid, name, avatar)
VALUES (0, :steamid, :secondname, :avatar)
ON CONFLICT (steamid) DO UPDATE
    SET name = excluded.name, avatar = excluded.avatar
RETURNING (steamid);


UPD: Обновил корректным и протестированым примером.
`excluded` — алиас на данные с коллизией.

Вместо конфликта по primary key можно отслеживать unique constraint violation:

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    steamid BIGINT UNIQUE NOT NULL ,
    balance DECIMAL NOT NULL,
    name VARCHAR(24) NOT NULL,
    avatar VARCHAR(2038) NOT NULL
);

INSERT INTO users (balance, steamid, name, avatar)
VALUES (0, :steamid, :secondname, :avatar)
ON CONFLICT (steamid) DO UPDATE
    SET id = excluded.id, name = excluded.name, avatar = excluded.avatar
RETURNING (steamid);
Ответ написан
@MaximaXXl
Используйте merge и будет Вам счастье
В Вашем случае это будет что то типа
MERGE INTO users u
USING (VALUES($1, $2, $3)) v
ON v.column1 = u.steamid 
WHEN NOT MATCHED 
  INSERT (balance, steamid, name, avatar) VALUES (0, v.column1, v.column2, v.column3)
WHEN MATCHED
  UPDATE SET name =v.column2;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы