Точный вопрос.
Table ROW
value1 a
value2 b
value3 null
value4 d
Параметры функции
CREATE OR REPLACE FUNCTION "GetValues"(
"@value1" VARCHAR(50),
"@value2" VARCHAR(50),
"@value3" VARCHAR(50),
"@value4" VARCHAR(50)
)
BEGIN
RETURN QUERY SELECT(
t."value1",
t."value2",
t."value3",
t."value4",
)
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
END;
Если я использую вышеуказанную функцию и предоставляю только следующее:
('a', null, null, 'd')
Он вернет []
, даже если 'a' и 'd' найдены, и я обнаружил, что это происходит только в том случае, если я предоставляю параметр для поиска чего-то, что является null
, и значение строки также null
.
СТАРЫЕ ОПИСАНИЕ НИЖЕ
Я настроил метод get, который успешно использует COALESCE
для поиска по нескольким или 1 параметрам.Однако, если какой-либо из этих параметров, которые не предоставлены (по умолчанию NULL), фактически равен NULL в БД, потому что я не обновлял это поле ранее, тогда он всегда будет возвращать пустой массив, даже если один из предоставленных параметровбудет успешное совпадение со строкой в таблице.
Я просто хочу знать, нужна ли мне вся новая система для выполнения этого поиска или это просто неудачный эффект COALESCE
?
Ниже приведен соответствующий фрагмент.
FROM "table" as t
WHERE t."value1" = COALESCE("@value1", c."value1")
AND t."value2" = COALESCE("@value2", c."value2")
AND t."value3" = COALESCE("@value3", c."value3")
AND t."value4" = COALESCE("@value4", c."value4");
В приведенном выше примере, если я предоставлю значение 1, и оно совпадает, но значение 4 в этом ряду равно NULL, то он вернет [].
return - это таблица с каждым из этих 4 значений.