【发布时间】:2011-03-30 21:15:25
【问题描述】:
如何使用 LIKE 子句忽略 SQLite3 上的重音符号进行 SELECT?
PS:它是为 Android 内置 SQLite 支持。
【问题讨论】:
如何使用 LIKE 子句忽略 SQLite3 上的重音符号进行 SELECT?
PS:它是为 Android 内置 SQLite 支持。
【问题讨论】:
有一个解决方案,它并不优雅,但可以在 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 是您要在列中找到的关键字。
【讨论】:
有一个类似的问题here。
他们说这在 Android 上是不可能的,但有一种解决方法,可以使用额外的规范化列。
【讨论】:
您可以创建一个掩码列并在使用触发器将值插入表后进行更新。
-- 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%');
【讨论】: