【sql】两表之间,两个字段的模糊查询及替换

一、数据说明
table_1。包含【区县-城市-省份】三个字段,区县(COUN)是此次需要处理的字段。给出6个示例值;
table_2。仅ethnic一个字段,所有民族名称。给出7个示例值。

数据库为SQLite,数据库之间的SQL语法差异可暂不考虑。至少这个小需求,应该不会出现大差异。


二、处理目标
table_1.COUN,针对这一字段的值
1、如果值由【地名+民族名称】组成,则去除民族名称,只保留地名;
2、如果值只含地名,则保持不变。

换另一种说法:
如果table_1.coun中的值,包含table_2.ethnic的值(%ethnic%),则去除table_2.ethnic的值

img


三、现行方案
可实现上述第1个处理目标。
但第2个处理目标不能实现——换种说法是以下SQL语句会导致【执行后,COUN字段中应当不变的值,被置为NULL】

UPDATE
    TABLE_1 AS A
SET
    COUN = (
        SELECT
            SUBSTR(
                A.COUN,
                1,
                INSTR(A.COUN, B.ETHNIC) -1
            )
        FROM
            TABLE_2 AS B
        WHERE
            A.COUN LIKE '%' || B.ETHNIC || '%'
    );

四、请指教
如何同时实现上述两个处理目标?理解是需要增加一个WHERE语句,但尝试几次都未能成功。
请帮指出思路或写出SQL语句,谢谢


五、附录
提供案例数据

table_a = {
    "COUN": {0: "本溪满族", 1: "麻阳苗族", 2: "江华瑶族", 3: "竹溪", 4: "白河", 5: "襄垣"},
    "CITY": {0: "本溪", 1: "怀化", 2: "永州", 3: "十堰", 4: "安康", 5: "长治"},
    "PROV": {0: "辽宁省", 1: "湖南省", 2: "湖南省", 3: "湖北省", 4: "陕西省", 5: "山西省"},
}

table_b = {
    "ETHNIC": {0: "满族", 1: "苗族", 2: "瑶族", 3: "汉族", 4: "白族", 5: "高山族", 6: "其他民族"}
}

img


这里的数据是一张表吗?

where挪到外面呢?

截取COUN后两个字段的值与ethnic做比较,用if函数

其中一个解决方法,核心是最外层的WHERE要限制替换的目标——不含少数民族名称,则不要发生替换/写入动作。

以下SQL经验证可行,重点请最外层的WHERE

UPDATE
    TABLE_1 AS A
SET
    COUN = (
        SELECT
            SUBSTR(A.COUN, 1, INSTR(A.COUN, B.ETHNIC) - 1)
        FROM
            TABLE_2 AS B
        WHERE
            A.COUN LIKE '%' || B.ETHNIC || '%'
    )
WHERE
    EXISTS (
        SELECT
            1
        FROM
            TABLE_2 AS B
        WHERE
            A.COUN LIKE '%' || B.ETHNIC || '%'
    );

这个问题最关键的点在于对update where 条件的理解,首先执行顺序是先where再set ,你在set虽然用了where条件,但那只是对字段对应关系内部的筛选,其实就相当于你在set中将coun字段根据对应关系获取查询的集合(当有一一对应限制条件时可以将这个集合当作字段使用),即把table_A表字段coun对应 替换为SUBSTR(A.COUN, 1, INSTR(A.COUN, B.ETHNIC) - 1) 字段,后面查询的结果只有3个,由于表A有超过3行记录,多余的默认记作null,所以还要再where条件后面再加个限制条件,理解原理就知道为什么同一个条件要加两次了,楼上的代码是正确的。