【问题标题】:Split a SQLite row bij given delimiter拆分给定分隔符的 SQLite 行 bij
【发布时间】:2016-06-20 05:16:53
【问题描述】:

我在 VB.NET 中编写了一个“电影”程序

用户将能够创建自定义过滤器,他们可以根据类型、导演、发行年份等一些简单的信息,在列表中指定他们想看的电影。

桌上电影的:

ID     Title     Director     Year     Genres      Description     Image

由于一部电影(或电视节目)可以有更多类型,我最终将这些类型存储到一个带有 ; 的字符串中。作为分隔符。

例子:

a01;a02;b08;c01

当然,在检索结果时,我的应用程序会将 a01 转换为适当的“恐怖”或“惊悚”类型等。

我的问题是:是否可以创建一个执行过滤的 SQLite 查询?目前我正在创建如下查询:

SELECT * 
FROM `movies` 
WHERE (`Year` = 2013) 
  AND (`Genres` LIKE '%a02%' OR `Genres` LIKE '%g05%')

这可以解决问题,但是基于一些自定义过滤器,您最终可能会得到超过 10kb 字符的查询。

SQLite 中是否有某种 SPLIT 函数,以便我可以这样查询:

SELECT * 
FROM `movies` 
WHERE (`Year` = '2013') 
  AND (SPLIT(`Genres`,';') IN ('a01','v05','c01'))

任何帮助将不胜感激

【问题讨论】:

    标签: vb.net sqlite


    【解决方案1】:

    [对 T-SQL 感到抱歉,但我只需要演示 MS SQL Server。 SQLite 的 SQL 应该非常相似,如果不相同的话。]

    你真正应该做的是为流派创建另一个表:

    然后你用类似的东西查询它

    SELECT DISTINCT M.[ID] AS [ID], [Title] AS [Title] FROM Movies AS M
    JOIN [MovieGenre] AS MG
    ON M.ID = MG.ID
    WHERE (MG.Genre IN ('A01', 'A02'))
    AND M.[Year] = 2010
    

    根据我的快速浏览,在 SQLite How to split comma-separated value in SQLite? 中将字符串拆分为一个表有点繁琐 - 请注意 cmets。

    但是,如果可以,那么您可以使用类似的东西

    -- This is a temporary table in SQL Server.
    -- It is only to illustrate joining onto a table of
    -- user-selected genres
    CREATE TABLE #genres
    (
        Genre NCHAR(10)
    )
    INSERT INTO #genres VALUES ('A01');
    INSERT INTO #genres VALUES ('B01');
    
    -- The query:
    SELECT DISTINCT M.[ID] AS [ID], [Title] AS [Title] FROM Movies AS M
    JOIN [MovieGenre] AS MG
    ON M.ID = MG.ID
    JOIN #genres AS TempG
    ON TempG.Genre = MG.Genre
    AND M.[Year] = 2010
    

    #genres 表是拆分字符串得到的表。

    然而当您在 VB.NET 中创建查询时,您可以在其中轻松拆分字符串并使用它轻松地将 IN 子句构建为字符串 - 一个小代码示例来说明:

    Module Module1
    
        Sub Main()
            Dim userSelectedGenres = "A01;A02"
            Dim gs = userSelectedGenres.Split(";"c)
            Dim inClause = String.Join(",", gs.Select(Function(g) "'" & g & "'"))
    
            Dim sqlString = <sql>SELECT DISTINCT M.[ID] AS [ID], [Title] AS [Title] FROM Movies AS M
    JOIN [MovieGenre] AS MG
    ON M.ID = MG.ID
    WHERE (MG.Genre IN (<%= inClause %>))
    AND M.[Year] = 2010
    </sql>.Value
    
            Console.WriteLine(sqlString)
    
            Console.ReadLine()
    
        End Sub
    
    End Module
    

    输出:

    SELECT DISTINCT M.[ID] AS [ID], [Title] AS [Title] FROM Movies AS M
    JOIN [MovieGenre] AS MG
    ON M.ID = MG.ID
    WHERE (MG.Genre IN ('A01','A02'))
    AND M.[Year] = 2010
    

    【讨论】:

    • 感谢您的回复,我用不同的表尝试过,我什至用“虚拟数据库”尝试过,但这给我程序的其余部分带来了巨大的性能问题,还有:带有数据的数据库本地存储在用户电脑上,更改每个用户数据库似乎不是一件明智的事情。我想我对这个案例的长查询感到困惑
    猜你喜欢
    • 2021-05-22
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多