在sqlite中使用“like”语句的高级用法

时间:2011-03-20 16:36:49

标签: iphone sqlite sql-like

我现在在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]'

但它无法选择任何数据。

如何选择正确类型的数据?

(由于公司要求,无法更改数据库)

3 个答案:

答案 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)

你可以试试这个

SELECT id
  FROM table 
 WHERE '|' + type + '|' LIKE '%|' + ? + '|%'

(我在这里使用+运算符,因为它更易于阅读,但您也可以使用||代替

这是一个没有正则表达式的简单解决方案。索引在这里没有任何帮助(这与正则表达式解决方案相同)查询对于大量数据来说会很慢。

我有一个类似question我不久前问过自己。另请检查answer