SQL,PostgreSQL:包含position()的多个OR条件的简写

时间:2019-01-19 16:19:24

标签: sql postgresql

有没有更好的方法来写这个:

SELECT * FROM table WHERE
 POSITION('x' in field1) > 0 OR
 POSITION('x' in field2) > 0 OR
 POSITION('x' in field3) > 0 OR
 etc...
 ;

类似的东西:

SELECT * FROM table WHERE
 POSITION('x' in (field1, field2, field3, etc...)) > 0 

2 个答案:

答案 0 :(得分:1)

我不知道执行此操作的本机方法,但是您可以很容易地将其包装在函数中。根据您可能希望将此功能应用于其他功能的评论,它可以扩展,因为您可以将样板(功能中的循环)保持在原位,并更改评估逻辑以满足您的未来需求。

它也适用于短循环,因为当它找到一个正值时,它将退出而无需进行其他不必要的评估。

CREATE OR REPLACE FUNCTION any_position(search_text text, variadic text_values text[])
  RETURNS integer AS
$BODY$
  declare
    element text;
    pos integer;
  begin
    foreach element in array text_values
    loop
      pos := position (search_text in element);
      if pos > 0 then
        return pos;
      end if;
    end loop;

    return 0;
  end;
$BODY$
  LANGUAGE plpgsql;

示例调用:

select any_position ('x', 'Five', 'Six', 'Seven')

答案 1 :(得分:0)

您始终可以连接字符串并将其用作一个参数:

SELECT * FROM table WHERE
 POSITION('x' in (field1 || field2 || field3) ) > 0

请注意,与||串联如果field1,field2,field3中的任何一个为null,则将为您提供NULL,而与concat函数的串联则不会:

SELECT * FROM table WHERE
 POSITION('x' in concat(field1, field2, field3) ) > 0

如果您要搜索一个字符,那应该没问题。但是,如果您要搜索例如如果字段1以“ a”结尾并且字段2以“ x”开头,则您不想匹配“ ax”,那么您也可以使用concat_ws函数在参数之间包括分隔符,例如:

SELECT * FROM table WHERE
 POSITION('x' in concat_ws('_##_', field1, field2, field3) ) > 0