Я пишу запрос, в котором хочу получить некоторые транзакции с активами из моей базы данных. Я использую 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, а затем продолжить.
Есть ли у вас пример использования sqlc, который вы могли бы показать мне? Я хочу избежать написания прямых запросов в своем коде и самостоятельной его деструктуризации.
Получил ответ из этого комментария:
Просто изменил мой запрос следующим образом:
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);
Судя по предоставленным фрагментам, вы, по сути, говорите, что вам нужно иметь предложение
WHERE
только в том случае, если у вас есть идентификатор актива для фильтрации результатов. Отлично, поэтому проверьте идентификатор актива и при необходимости добавьте предложениеwhere в свой запрос. На самом деле никаких хитростей с SQL не требуется. ЦЕЛОВАТЬ