SQL 中数组参数为空时返回所有数据

问题描述 投票:0回答:1

我是一名前端开发人员,正在尝试使用 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;
sql postgresql supabase
1个回答
0
投票

空数组与

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;
© www.soinside.com 2019 - 2024. All rights reserved.