使用LIKE编写UPDATE查询

时间:2013-06-19 14:25:55

标签: sql postgresql

我有两个名为TableATableB的表。 TableATableB都包含以下列:namemember_idTableB目前包含member_id的“正确”值,而TableA则不包含。{/ 1}

我想要做的是将member_id的{​​{1}}列中的所有值迁移到TableB中的相应列(与列{{1}中的值匹配) }专栏)。但是,有时两个表之间的名称输入略有不同。

我在SQL查询后写了这个,尽管TableA下的子查询不正确。有人可以帮助我吗?感谢。

name

另外,我将其设置为当WHEN EXISTS未知时,将其设置为0. 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' cluase是将member_id列中的0更新为1,以便我知道该查询已经运行并修改了该行。

澄清:我希望设置 ELSE '1' = member_id TableA.member_id 类似于 TableB.member_id 0和1用于调试,而不是最终目标。

2 个答案:

答案 0 :(得分:1)

引号中有TABLEA.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'

此外,LIMIT 1不是必需的,因为您正在检查是否存在。

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

UPDATE TableA
    SET member_id = '1'
    WHERE TableA.member_id = '0' and
          exists (SELECT member_id
                  FROM TableB
                  WHERE TableB.name ILIKE '%' || TableA.name || '%'
                 )

编辑(回应评论)

以下是获取会员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'

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

答案 1 :(得分:0)

替代方案,无需like

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从字符更改为数字,这对我来说更有意义。

测试数据:

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