有没有更好的方法来写这个:
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
答案 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