如何匹配最长的字符串并更新值?
Posted
技术标签:
【中文标题】如何匹配最长的字符串并更新值?【英文标题】:How to match the longest string and update the value? 【发布时间】:2011-06-17 03:32:05 【问题描述】:我需要比较和匹配两个不同表中两个字符串的最长匹配项,如果有最接近的匹配项,则更新一个值。
Table 1 Table 2
stack1 stack2
ABCDEFG ABC
GHIJKLM ABCDE
PQRSUVW ABCDEF
我需要比较这两个表并匹配壁橱一个并将表 1 第一行更新为最接近的匹配项,请任何人帮助我。我被困在这里了。
这是我的查询
UPDATE table1 A
SET A.stack1 = (SELECT DISTINCT B.stack2
FROM table2 B
WHERE A.stack1 LIKE CONCAT(B.stack2,'%'))
WHERE name = 'name';
有了这个查询,我得到了一个名为
的错误ORA-01427: 单行子查询返回多于一行
【问题讨论】:
你有两个问题,a)子选择返回多行;A.stack1 in (
应该解决这个问题。 b) 您不能更新具有将在子选择中使用的值的表(这可能仅在您的子选择包含您正在更新的表时)。
【参考方案1】:
您需要使子查询只返回一个匹配项(最长的一个)。在您的情况下,MAX 应该这样做。
UPDATE table1 A
SET A.stack1 = (SELECT Max( B.stack2 )
FROM table2 B
WHERE A.stack1 LIKE CONCAT(B.stack2,'%'))
WHERE name = 'name';
另外,你应该考虑没有匹配的情况。
【讨论】:
非常感谢,它有效:) 如何将此问题标记为已回答? @sailaja:点击答案左侧箭头下方的复选标记。 MAX 不返回最长的,它返回最大值。您需要在长度与 table2 中 stack2 的 MAX 长度匹配的子查询中从 table2 返回 stack2。 (您仍然需要 MAX 或 MIN 返回值,因为可能有超过 1 个具有最大长度的字符串。) @Datajam Ltd:如果它们都共享相同的前缀,则 MAX 返回最长的字符串(就像他们在此处所做的那样)。【参考方案2】:ORA-01427 错误表示子查询返回了多个值——即使是 DISTINCT
。
您需要更正返回多个不同值的情况。可以使用聚合函数,例如 MAX
或 MIN
,但如果没有详细信息,我会犹豫提出该建议。
【讨论】:
用这个查询得到 ORA-00927: missing equal sign error以上是关于如何匹配最长的字符串并更新值?的主要内容,如果未能解决你的问题,请参考以下文章
Redshift:如何从字符串列表中匹配最长的正则表达式字符串