Понимание COALESCE в postgres - PullRequest
       53

Понимание COALESCE в postgres

0 голосов
/ 13 сентября 2018

Точный вопрос.

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 значений.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Должно ли это быть простое сравнение строк ( выдает все строки, которые имеют те же значения, что и входные параметры )?

Это может быть просто достигнуто компаратором строк ( документация ):

WHERE row(t.*) IS NOT DISTINCT FROM row("@value1", "@value2", "@value3", "@value4")

демо: дБ <> скрипка

Если NULL в качестве входного параметра функции должен быть подстановочным знаком, то решение @ kurkle работает хорошо.

0 голосов
/ 14 сентября 2018

Вы можете сделать это так:

  FROM test as t
  WHERE ("@value1" IS NULL OR t."value1" = "@value1")
  AND ("@value2" IS NULL OR t."value2" = "@value2")
  AND ("@value3" IS NULL OR t."value3" = "@value3")
  AND ("@value4" IS NULL OR t."value4" = "@value4");

дб <> скрипка

...