Дополнительный фильтр по запросу с помощью sqlc с Postgres в Golang

Я пишу запрос, в котором хочу получить некоторые транзакции с активами из моей базы данных. Я использую sqlc для генерации запросов, но не могу понять, как это сделать правильно.

Я хочу предоставить дополнительный идентификатор актива (UUID). Если указанный идентификатор актива имеет значение null (представленный pgtype.UUID{Valid: false}), то я хочу получить все транзакции с активами независимо от актива, но когда я предоставляю ненулевое значение, я хочу, чтобы транзакции с активами были только для этого идентификатор актива.

Это мой запрос на данный момент:

SELECT * FROM asset_txn WHERE asset_id = $1;

ChatGPT предлагает такие вещи, как:

SELECT * FROM asset_txn WHERE asset_id = COALESCE($1, asset_id)

Проблема в том, что когда sqlc генерирует код для запроса, идентификатор ресурса имеет вид uuid.UUID, а не pgtype.UUID, а это означает, что я не могу указать нулевое значение. Однако это ожидаемое поведение, поскольку мой assets_id является обязательным полем. Нужна помощь, чтобы выяснить, как проверить, имеет ли значение assets_id значение null, а затем продолжить.

🤔 А знаете ли вы, что...
PostgreSQL - это мощная и открытая система управления реляционными базами данных.


2
51
1

Ответ:

Решено

Получил ответ из этого комментария:

Просто изменил мой запрос следующим образом:

SELECT * FROM asset_txn 
WHERE (asset_id = $1 
    OR NOT @filter_by_asset_id::bool);

Это позволило мне добавить assets_id, если я хотел фильтровать по нему, иначе будут выбраны все транзакции с активами.

Другой вариант из здесь:

SELECT * FROM asset_txn 
WHERE asset_id = COALESCE(sqlc.narg('asset_id'), asset_id);