Sql 使用LIKE编写更新查询

Sql 使用LIKE编写更新查询,sql,postgresql,Sql,Postgresql,我有两个名为TableA和TableB的表。TableA和TableB都包含以下列:name,member\u id表格B当前包含成员id的“正确”值,而表格A不包含 我想做的是将TableB的member\u id列中的所有值迁移到TableA中的相应列(由name列中的值匹配)。但是,有时两个表之间键入的名称略有不同 我编写了以下SQL查询,尽管存在时下的子查询不正确。有人能帮我吗?谢谢 UPDATE TableA SET member_id = CASE WHEN EXISTS

我有两个名为
TableA
TableB
的表。
TableA
TableB
都包含以下列:
name
member\u id
<代码>表格B当前包含
成员id
的“正确”值,而
表格A
不包含

我想做的是将
TableB
member\u id
列中的所有值迁移到
TableA
中的相应列(由
name
列中的值匹配)。但是,有时两个表之间键入的名称略有不同

我编写了以下SQL查询,尽管存在时
下的子查询不正确。有人能帮我吗?谢谢

UPDATE TableA
SET member_id = 
CASE
    WHEN EXISTS
    (SELECT member_id
    FROM TableB
    WHERE TableB.name ILIKE '%' || 'TableA.name' || '%'
    LIMIT 1)

    THEN member_id

    ELSE '1'
END
WHERE 
TableA.member_id = '0'
此外,我将其设置为当
成员id
未知时,将其设置为0。
ELSE“1”
cluase将
member\u id
列中的0更新为1,以便我知道查询已经运行并修改了该行


澄清:我希望设置
表格A.member\u id
=
表格B.member\u id
其中
表格A.name
类似于
表格B.name
0和1用于调试,而不是最终目标。

您在引号中有
表a.NAME
。删除它们:

UPDATE TableA
    SET member_id = (CASE WHEN EXISTS (SELECT member_id
                                       FROM TableB
                                       WHERE TableB.name ILIKE '%' || TableA.name || '%'
                                      )

                          THEN member_id
                          ELSE '1'
                     END)
    WHERE TableA.member_id = '0'
此外,
限制1
是不必要的,因为您正在检查是否存在

并且,您可以将条件移动到
where
子句,以澄清逻辑(在我看来):

编辑(回应评论)

下面是获取成员id的一种方法。这种方法取最大值。通过使用聚合函数,查询可以在聚合中使用
coalesce()
,以提供未知值:

UPDATE TableA
    SET member_id = (SELECT coalesce(max(member_id), 'Unknown')
                     FROM TableB
                     WHERE TableB.name ILIKE '%' || TableA.name || '%'
                    )
    WHERE TableA.member_id = '0';
最后,您可以使用
join
语法编写:

UPDATE TableA
    SET TableA.member_id = TableB.member_id
    FROM TableB
    WHERE TableB.name ILIKE '%' || TableA.name || '%' and
          TableA.member_id = '0'

如果有多个匹配项,则查询将选择任意一个。

替代方案,而不需要类似的

UPDATE TableA dst
SET member_id =  COALESCE ( src.member_id, -1 )
FROM (
        SELECT a.name , b.member_id
        FROM TableA a
        LEFT JOIN TableB b ON POSITION (b.name IN a.name) > 0
        ) src
WHERE  dst.name = src.name
AND dst.member_id < 10
        ;
结果:

 member_id | name  
-----------+-------
        11 | Jack
        12 | Jill
        -1 | Bob
        14 | Alice

首先,
TableA.name
不应在引号中。感谢您的澄清,我希望设置TableA.member\u id=TableB.member\u id,其中TableA.name与TableB.name类似。0和1是要调试的,而不是最终目标。
CREATE TABLE TableA ( member_id INTEGER , name varchar);
CREATE TABLE TableB ( member_id INTEGER , name varchar);

INSERT INTO TableA(member_id,name) VALUES
(0, 'Jack' ), ( 1, 'Jill'), (2 , 'Bob'), ( 3, 'Alice' );
INSERT INTO TableB(member_id,name) VALUES
(11, 'ack' ), ( 12, 'ill'), (13 , 'Do'), ( 14, 'lic' );
 member_id | name  
-----------+-------
        11 | Jack
        12 | Jill
        -1 | Bob
        14 | Alice