【问题标题】:Problem while using NSPredicate使用 NSPredicate 时出现问题
【发布时间】:2011-06-14 11:04:01
【问题描述】:

Sql查询:

从 test_mart 中选择 * 其中replace(replace(replace(replace(replace(replace(lower(name),'+'),'_'),'the'),'the'),'a'),'a')='tariq '

如果我必须使用简单的 Sqlite,我可以很容易地触发以下查询...但是在当前项目中,我使用的是 Core Data,所以对 NSPredicate 不太熟悉。

该功能涉及删除所有 BUT 字母数字字符,这意味着删除特殊字符。

在比较中应该有效的字符是

ABCDEFGHIJKLMNOPQRESTUVWXYZ1234567890

但我们不应该让以下字符的比较失败

:;,~`!@#$%^&*()_-+="'/?.>,

或者对于下面的词

'the' 'an' 'a'

一些例子:

  1. “Walmart”将被视为与“Wal-Mart”相同的收款人

  2. “The Shoe Store”将被视为与“Shoe Store”相同的收款人

  3. “Domino's Pizza”将被视为与“Dominos Pizza”相同的收款人

  4. '测试收款人;'将被视为与“测试收款人”相同的收款人

任何人都可以建议适当的谓词/正则表达式吗?

谢谢

【问题讨论】:

    标签: iphone sqlite core-data nspredicate


    【解决方案1】:

    在我看来,您可能希望在将数据设置为核心数据存储之前对其进行规范化。因此,如果给您“Wal-Mart”,请将其标准化为“walmart”一次,然后保存。这样您就不会多次进行所有这些昂贵的即时比较。

    根据您的规则,标准化将相当简单:

    • 去掉“a”、“an”和“the”这些词
    • 删除标点符号

    【讨论】:

      【解决方案2】:

      我会在数据库中有一个额外的字段,它将是原始版本的处理版本,其中所有不相关的字符都被删除了。然后用它来比较。

      您可能想查看更适合您的目的的 soundex 算法...Soundex

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 2015-11-13
        相关资源
        最近更新 更多