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