如何用PL/SQL在字符串表中匹配另一张表的指定值?
解决方案
可以通过关联查询+模糊匹配实现基于第一张表的值,在第二张表的STRING列中搜索匹配,以下是具体实现:
1. 基础SQL查询(直接获取匹配结果)
假设第一张表名为animal_list,存储动物名称的列是animal_name;第二张表名为target_table,结构为你提供的ID和STRING列。可以用INSTR函数判断STRING列是否包含表1的动物名称:
SELECT t.ID, a.animal_name AS matched_animal FROM target_table t JOIN animal_list a ON INSTR(UPPER(t.STRING), UPPER(a.animal_name)) > 0 WHERE t.ID IS NOT NULL -- 过滤表2中空行 ORDER BY t.ID;
如果偏好LIKE语法,也可以这样写:
SELECT t.ID, a.animal_name AS matched_animal FROM target_table t JOIN animal_list a ON UPPER(t.STRING) LIKE '%' || UPPER(a.animal_name) || '%' WHERE t.ID IS NOT NULL ORDER BY t.ID;
2. PL/SQL块(批量处理或控制台输出结果)
如果需要用PL/SQL执行并输出匹配结果,可使用游标遍历:
DECLARE CURSOR match_cursor IS SELECT t.ID, a.animal_name FROM target_table t JOIN animal_list a ON INSTR(UPPER(t.STRING), UPPER(a.animal_name)) > 0 WHERE t.ID IS NOT NULL; v_id target_table.ID%TYPE; v_animal animal_list.animal_name%TYPE; BEGIN OPEN match_cursor; LOOP FETCH match_cursor INTO v_id, v_animal; EXIT WHEN match_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ' 匹配到动物: ' || v_animal); END LOOP; CLOSE match_cursor; END; /
关键说明
UPPER函数用于忽略大小写匹配,如果你的数据是严格大小写一致的,可以直接移除该函数。INSTR返回子串在字符串中的位置,返回值>0即表示存在匹配;LIKE '%值%'是通配符匹配,两者效果一致。- 过滤
t.ID IS NOT NULL是为了排除表2中那行空数据。
只要表2的STRING列实际包含对应动物名称(比如ID1的STRING为COWS_PINK、ID2的STRING为SAUSAGES_SHEEP),上述语句就能得到你期望的ID与动物的对应结果。
内容的提问来源于stack exchange,提问作者WanderingMushroom
相关产品推荐
相关产品推荐

