В SQL у меня есть следующий код:
-- name: FilterRecords :many
SELECT *
FROM records
WHERE industry_id = $3 and region_code = $4 and city_code = $5
OFFSET $1 LIMIT $2;
Чего я пытаюсь добиться, так это исключить из предложения where industry_id, если предоставленное значение для него является пустой строкой. Потому что, когда я делаю запрос, он подсчитывает пустые строки, но я хочу опустить его, если он пуст, и выбрать только те записи, в которых они совпадают с region_code и city_code.
(industry_id = $3 or '' = $3)То, что сказал @Stu, поможет. Что я обычно делаю в подобных случаях: COALESCE(NULLIF($3, ''), отраслевой_ид) = отраслевой_ид на тот случай, если значение NULL пробирается вместо пустой строки.
@D.Tabakov Это сработало идеально, как я и хотел, и это так просто. Спасибо!.


Вы можете сделать это по умолчанию в golang text/template.
variables := map[string]interface{} {
"industry_id": ...,
"region_id": ...,
"city_code": ...,
"offset": ...,
"limit": ...,
}
qs := new(strings.Builder)
template.Must(template.New("qt").Parse(`
SELECT *
FROM records where
{{ if .industry_id-}} industry_id= {{.industry_id}} and {{- end }}
region_code = {{.region_code}} and city_code = {{.city_code}}
OFFSET {{.offset}} LIMIT {{.limit}}`)).
Execute(qs, variables)
fmt.Printf("qs: %v\n", qs.String())
примечание: этот пример уязвим для SQL-инъекций
Но параметры будут проанализированы откуда-то со связанным типом, а затем они будут помещены в интерфейс map[string]{}. Это так, тогда никакого риска.
если мой код города был "NYC; DROP TABLE records;" тогда я бы отбросил вашу таблицу, и в следующей строке возникла бы ошибка. Предполагая, что все входные данные должным образом продезинфицированы, тогда да, строковый шаблон будет работать.
Спасибо за ваше объяснение. теперь понял.
Это тот, который был сделан для меня и работал правильно.
-- name: FilterApz :many
SELECT *
FROM apz
WHERE industry_id LIKE COALESCE(NULLIF($3, ''), '%%') and region_code = $4 and city_code = $5
OFFSET $1 LIMIT $2;
Пожалуйста, покажите как образцы данных, так и ожидаемый результат в виде таблиц в вашем вопросе.