我是一名前端开发人员,正在尝试使用 supabase 开发一个业余爱好项目。
我有一个
supplies
表,其中有 name
、company
、type
列。 company
和 type
值是外键并分别绑定到 supplies_companies
和 supplies_types
表。
我正在尝试将 RPC 添加到模糊搜索
supplies
需要 3 个参数的表
query: string
companies: string[]
types: string[]
该函数的行为应如下
supplies
为空,则返回所有 query
。否则类似的耗材名称。supplies
是空数组,则返回所有 companies
。否则,仅返回 company
参数中存在
companies
types
与 companies
具有相同的条件。我当前的代码的行为符合预期,除了将空数组传递给
companies
和 types
的情况下,它总是返回一个空数组,它应该返回所有结果。我不知道我错过了什么。
CREATE OR REPLACE FUNCTION fuzzy_search_supplies(query TEXT, companies TEXT[], types TEXT[])
RETURNS SETOF supplies AS $$
BEGIN
RETURN QUERY
SELECT s.*
FROM supplies s
WHERE (
(
query = '' -- Return all results if `query` is empty
OR similarity(s.name, query) > 0.2 -- Otherwise return rows with similar `name` to `query`
)
AND (
companies IS NULL -- Return all companies if `companies` is empty
OR EXISTS ( -- Otherwise return rows with same `company`
SELECT 1
FROM unnest(companies) AS company
WHERE s.company = company
)
)
AND (
types IS NULL -- Return all types if `types` is empty
OR EXISTS ( -- Otherwise return rows with same `type`
SELECT 1
FROM unnest(types) AS type
WHERE s.type = type
)
)
);
END;
$$ LANGUAGE plpgsql;
空数组与
NULL
不同,始终检查空数组并验证其是否有效。潜在的修复可能是:
CREATE OR REPLACE FUNCTION fuzzy_search_supplies(query TEXT, companies TEXT[], types TEXT[])
RETURNS SETOF supplies AS $$
BEGIN
RETURN QUERY
SELECT s.*
FROM supplies s
WHERE (
(
query = '' -- Return all results if `query` is empty
OR similarity(s.name, query) > 0.2 -- Otherwise return rows with similar `name` to `query`
)
AND (
companies IS NULL OR companies = '{}' -- Return all companies if `companies` is NULL or empty
OR EXISTS ( -- Otherwise return rows with same `company`
SELECT 1
FROM unnest(companies) AS company
WHERE s.company = company
)
)
AND (
types IS NULL OR types = '{}' -- Return all types if `types` is NULL or empty
OR EXISTS ( -- Otherwise return rows with same `type`
SELECT 1
FROM unnest(types) AS type
WHERE s.type = type
)
)
);
END;
$$ LANGUAGE plpgsql;