【问题标题】:How to check if a string is a substring of another, without using large ResultSets?如何在不使用大型结果集的情况下检查一个字符串是否是另一个字符串的子字符串?
【发布时间】:2011-10-31 04:06:27
【问题描述】:

我正在尝试用 java 编写一个 webprice 比较软件。我有一个数据库,其中已经有很多产品类型编号(如“ASD01”)。我还有另一个数据库,其产品类型编号如下:'somethingASD01something'。

我想检查数据库#2 是否包含数据库#1 中的字符串。并删除不包含的行。我试图解决它,在结果集中选择两个 db,并在 java 代码中比较它们,但是它们太大并且使用太多内存。

我在 mysql 中找到了 LOCATE() 方法,它告诉我我想要什么,但我仍然要使用 database#1 作为 ReultSet,或者还有其他方法可以遍历行吗?

【问题讨论】:

    标签: mysql jdbc memory-leaks resultset


    【解决方案1】:

    如果我正确理解了这个问题,您应该能够使用直接 SQL 删除您不想要的记录...

    如果您想从 DB2 中删除 不匹配 到 DB1 中的表的记录,那么 LEFT JOIN 将是一种方法... DB2 LEFT JOIN DB1 在您的字符串比较上,然后删除没有 DB1 匹配的任何 DB2 记录:

    DELETE `DB2`.`TableTwo`.*
    
    FROM `DB2`.`TableTwo` a
    LEFT JOIN `DB1`.`TableOne` t
    
    on a.FieldFromTableTwo LIKE CONCAT('%', t.FieldFromTableOne, '%')
    
    WHERE t.FieldFromTableOne IS NULL
    

    【讨论】:

    • 哦,抱歉,您似乎不想删除匹配项,您想从 DB2 中删除与 DB1 中的内容不匹配的记录.. 嗯,我会修改。
    • a.FieldName LIKE = "%ASD01%" 不会很快。它必须全面扫描a 表。
    • 如果您只需要该操作一次(并删除一些行),那么我认为您不必担心。
    • 没错,它不会很快。但目前尚不清楚他是否需要只运行一次或按需运行的东西。这是我能想到的最简单的答案,可能正是他所需要的。
    • 是的,而且可能比 LOCATE() 更快。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2013-05-12
    • 2011-02-07
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多