Можно ли опустить поле в предложении where в postgresql?

В 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.

Пожалуйста, покажите как образцы данных, так и ожидаемый результат в виде таблиц в вашем вопросе.

Jonas Metzler 24.07.2023 14:13
(industry_id = $3 or '' = $3)
Stu 24.07.2023 14:17

То, что сказал @Stu, поможет. Что я обычно делаю в подобных случаях: COALESCE(NULLIF($3, ''), отраслевой_ид) = отраслевой_ид на тот случай, если значение NULL пробирается вместо пустой строки.

D.Tabakov 24.07.2023 15:25

@D.Tabakov Это сработало идеально, как я и хотел, и это так просто. Спасибо!.

Islom 25.07.2023 06:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать это по умолчанию в 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-инъекций

JBirdVegas 24.07.2023 18:29

Но параметры будут проанализированы откуда-то со связанным типом, а затем они будут помещены в интерфейс map[string]{}. Это так, тогда никакого риска.

Shahriar Ahmed 24.07.2023 18:45

если мой код города был "NYC; DROP TABLE records;" тогда я бы отбросил вашу таблицу, и в следующей строке возникла бы ошибка. Предполагая, что все входные данные должным образом продезинфицированы, тогда да, строковый шаблон будет работать.

JBirdVegas 24.07.2023 18:56

Спасибо за ваше объяснение. теперь понял.

Shahriar Ahmed 25.07.2023 05:49
Ответ принят как подходящий

Это тот, который был сделан для меня и работал правильно.

-- 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;

Другие вопросы по теме