我有一个sqlite3数据库,其中一列包含列表的字符串表示形式(例如:“''hello','there','example']”)。我需要使用SELECT命令和LIKE子句来提取行,其中这样的'list'的元素包含某个子字符串。我知道如何构建一个命令来提取具有一个值包含子字符串的列的行,但我不知道如何检查列中“列表”的各个元素(表示为字符串)是否包含子。这是我知道如何编写以检索包含子字符串的列的代码。
SELECT * FROM yourDatabase WHERE UPPER(column) LIKE UPPER(?)",('%'+substring+'%',)
注意:我只能读取数据库的每一行,将'list'列转换为实际列表,然后检查该列表元素中的子字符串,但这似乎非常低效。
答案 0 :(得分:0)
你几乎肯定不想这样做。随着数据库大小的增加,这将变得越来越不具备性能。这是因为执行此查询时,您的数据库引擎必须线性扫描每一行,以对该列执行一些昂贵的字符串操作。
您想要的是many-to-many或one-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
您可以有效地提出以下问题:
x
(SELECT * FROM tags LEFT JOIN posts_have_tags ON tags.id = posts_have_tags.tag_id WHERE posts_have_tags.post_id = x
)x
(SELECT * FROM posts LEFT JOIN posts_have_tags ON posts.id = posts_have_tags.post_id WHERE posts_have_tags.tag_id = x
)这可以更好地扩展,因为数据库引擎可以有效地构建这些关系的可查询表示。
您的另一个选择是使用NoSQL数据库,该数据库本身将允许可以执行这些操作的文档存储(通常是JSON)(尽管扫描通常仍然效率低下)。
作为旁注,如果您正在使用Postgres,则最新版本支持JSON列which can be efficiently queried。