我现在在iPhone平台上处理sqlite并使用一些奇怪的实体处理数据库。此DB中的一列名为type,它允许多个值(多个类型)。此列中的数据如下:
1|9|20|31|999
表格如下:
ID TYPE
------------------------
1 1|9|20|31|999
2 5|13|15|30|990
3 6|7|45|46|57
当用户想要选择类型为9的数据时,需要选择上面的数据,因为实体包含9.我使用以下语句执行:
SELECT id
FROM table
WHERE type LIKE '%' || ? || '%'
问题是还将选择类型为999且没有类型9的数据。此外,如果用户想要选择类型1,也将选择类型为11,12,13 ......的数据。
我试图使用声明:
SELECT id
FROM table
WHERE type LIKE '[^0123456789]' || ? || '[^0123456789]'
但它无法选择任何数据。
如何选择正确类型的数据?
(由于公司要求,无法更改数据库)
答案 0 :(得分:2)
您需要一个仅与'yournumber|'
,'|yournumber|'
,'|yournumber'
或上述内容的组合匹配的正则表达式。我认为优化器无法使用索引来处理那种与专用索引类似的专用索引。
这几乎是没有希望的,除非你有大量的数据(或者处理资源太多),它不会扩展。
如果数据量很小,请考虑选择like '%number%'
,然后在应用程序代码中进行一些后处理。
否则,请将数据标准化。
答案 1 :(得分:0)
我对SQLite并不太熟悉,但是:
SELECT id FROM table WHERE type REGEX '(^9\|.*)|(.*\|9\|.*)|(.*\|9$)';
假设您正在寻找类型9
然后查找类型999
,它将是:
SELECT id FROM table WHERE type REGEX '(^999\|.*)|(.*\|999\|.*)|(.*\|999$)';
请注意,如果您在type
字段中可能只有一个类型值,则可能需要调整表达式,因为在这种情况下,我认为不会有任何|
个字符
答案 2 :(得分:0)