在生成SELECT命令

时间:2018-03-23 03:38:43

标签: python sqlite

我有一个sqlite3数据库,其中一列包含列表的字符串表示形式(例如:“''hello','there','example']”)。我需要使用SELECT命令和LIKE子句来提取行,其中这样的'list'的元素包含某个子字符串。我知道如何构建一个命令来提取具有一个值包含子字符串的列的行,但我不知道如何检查列中“列表”的各个元素(表示为字符串)是否包含子。这是我知道如何编写以检索包含子字符串的列的代码。

SELECT * FROM yourDatabase WHERE UPPER(column) LIKE UPPER(?)",('%'+substring+'%',)

注意:我只能读取数据库的每一行,将'list'列转换为实际列表,然后检查该列表元素中的子字符串,但这似乎非常低效。

1 个答案:

答案 0 :(得分:0)

你几乎肯定不想这样做。随着数据库大小的增加,这将变得越来越不具备性能。这是因为执行此查询时,您的数据库引擎必须线性扫描每一行,以对该列执行一些昂贵的字符串操作。

您想要的是many-to-manyone-to-many relationship。在一个真实示例的上下文中,StackOverflow帖子有许多标签。通过多对多关系,您可以拥有如下表格结构:

posts 
id | integer

posts_have_tags
post_id | foreign key(posts)
tag_id  | foreign key(tags)

tags
id   | integer
name | string

您可以有效地提出以下问题:

  • 为我提供ID = xSELECT * FROM tags LEFT JOIN posts_have_tags ON tags.id = posts_have_tags.tag_id WHERE posts_have_tags.post_id = x
  • 的所有帖子
  • 将标有xSELECT * FROM posts LEFT JOIN posts_have_tags ON posts.id = posts_have_tags.post_id WHERE posts_have_tags.tag_id = x
  • 标记的所有帖子标记给我
  • ID = x的帖子是否有某个标签?

这可以更好地扩展,因为数据库引擎可以有效地构建这些关系的可查询表示。

您的另一个选择是使用NoSQL数据库,该数据库本身将允许可以执行这些操作的文档存储(通常是JSON)(尽管扫描通常仍然效率低下)。

作为旁注,如果您正在使用Postgres,则最新版本支持JSON列which can be efficiently queried