在Oracle IN子句中使用LIKE的替代方法

pieyvz9o  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(213)

在Oracle / PL/SQL上,我知道我不能同时使用LIKE和IN子句来执行以下操作:

select * from booking_details where tags LIKE ('%val1%', '%val2%', 'val3%',....);

要达到上述目的,我可以这样做:

select * from booking_details where tags LIKE '%val1%' OR tags LIKE '%val2%' OR tags LIKE '%val3%' OR ... ;

我想把这个方法应用到我们现有的一个程序中。

function search_bookings(  pi_search_string in varchar2 , po_bookings out booking_tbl_typ)
    return integer as

    t_booking_table booking_tbl_typ := booking_tbl_typ();
    v_search_string varchar2(120) := pi_search_string;

begin

    declare
       result number;
    begin
        ...
    end;

    select booking_typ (
         booking_id
        ,...
    ) 
    bulk collect
        into t_booking_table
    from booking_details bd
    where
        ...
        and (bd.tags like '%'|| lower(v_search_string)||'%')
    order by booking_id, start_date;

    po_bookings := t_booking_table;
    return c_success;

exception 
    when NO_DATA_FOUND then 
        return c_success;
    when OTHERS then
        log_error_msg(...);
        v_excep_msg  :=  sqlerrm;

    return c_failure;
end search_bookings;

用户的应用程序基本上可以输入任何pi_search_string,但目前它只适用于搜索一个标签。我希望将pi_search_string拆分成关键字的空格和搜索多个标签的方式:

select * from booking_details where tags LIKE '%keyword1%' OR tags LIKE '%keyword2%' OR tags LIKE '%keyword3%' OR ... ;

因为查询会根据用户的输入而变化,所以我不确定这是否可以实现。

waxmsbnn

waxmsbnn1#

您可以将REGEXP_LIKE与以下替换形式一起使用:

SELECT *
FROM booking_details
WHERE REGEXP_LIKE(tags, 'val1|val2|val3');

在您的存储过程中,您只需要构建管道分隔的关键字字符串。

相关问题