【问题标题】:Ignore accents SQLite3忽略重音 SQLite3
【发布时间】:2011-03-30 21:15:25
【问题描述】:

如何使用 LIKE 子句忽略 SQLite3 上的重音符号进行 SELECT?

PS:它是为 Android 内置 SQLite 支持。

【问题讨论】:

    标签: android sql sqlite


    【解决方案1】:

    有一个解决方案,它并不优雅,但可以在 Android 上运行。

    函数 REPLACE 可以用普通字符替换重音字符。示例:

    SELECT YOUR_COLUMN FROM YOUR_TABLE WHERE replace(replace(replace(replace(replace(replace(replace(replace(
    replace(replace(replace( lower(YOUR_COLUMN), 'á','a'), 'ã','a'), 'â','a'), 'é','e'), 'ê','e'), 'í','i'),
    'ó','o') ,'õ','o') ,'ô','o'),'ú','u'), 'ç','c') LIKE 'SEARCH_KEY%'
    

    或者使用unicode:

    SELECT YOUR_COLUMN FROM YOUR_TABLE WHERE replace(replace(replace(replace(replace(replace(replace(replace(
    replace(replace(replace( lower(YOUR_COLUMN), '\u00E1','a'), '\u00E3','a'), '\u00E2','a'), '\u00E9','e'), '\u00EA','e'), '\u00ED','i'),
    '\u00F3','o') ,'\u00F5','o') ,'\u00F4' ,'o'),'\u00FA','u'), '\u00E7' ,'c') LIKE 'SEARCH_KEY%'
    

    其中 SEARCH_KEY 是您要在列中找到的关键字。

    【讨论】:

    • 这对性能也不是很好,但至少是一个解决方案
    • @MarcosVasconcelos 是的,性能不好。但这是一个可能的解决方案。
    • 我们可以通过在replace函数调用中使用REGEX来减少查询字符串中“replace”函数的数量吗?
    • @TuanPM,我认为也许可以使用正则表达式,但我不知道如何。如果你知道,请在这里分享。
    • @Derzu 不幸的是,我也不知道。顺便说一句,在Android上运行时,过多的“替换”函数可能会导致“SQLiteException:解析器堆栈溢出”。
    【解决方案2】:

    有一个类似的问题here

    他们说这在 Android 上是不可能的,但有一种解决方法,可以使用额外的规范化列。

    【讨论】:

      【解决方案3】:

      您可以创建一个掩码列并在使用触发器将值插入表后进行更新。

      -- Table
      CREATE TABLE IF NOT EXISTS mytable (
          id TEXT PRIMARY KEY,
          description TEXT default '',
          description_mask TEXT default ''
      );
      
      -- Trigger
      CREATE TRIGGER IF NOT EXISTS mytable_in AFTER INSERT ON mytable
      BEGIN
        UPDATE mytable
        SET description_mask =
        lower(
        replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
        replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
        NEW.description,
        'á','a'), 'ã','a'), 'â','a'), 'é','e'), 'ê','e'), 'í','i'), 'ó','o') ,'õ','o') ,'ô','o'),'ú','u'),'ç','c'),'ñ','n'),
        'Á','a'), 'Ã','a'), 'Â','a'), 'É','e'), 'Ê','e'), 'Í','e'), 'Ó','o') ,'Õ','o') ,'Ô','o'),'Ú','u'),'Ç','c'),'Ñ','n')
        )
        WHERE id = NEW.id;
      END;
      
      -- Select example
      SELECT * FROM mytable WHERE (description LIKE '%acido%' OR description_mask LIKE '%ácido%');
      

      【讨论】:

        猜你喜欢
        • 2016-05-05
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        相关资源
        最近更新 更多