访问数据库查询以将由“,”分隔的列拆分为多行

Posted

技术标签:

【中文标题】访问数据库查询以将由“,”分隔的列拆分为多行【英文标题】:Access DB Query to split the columns delimited by "," to multiple rows 【发布时间】:2018-06-26 10:23:52 【问题描述】:

我使用的是Access DB,表中数据如下

ID  Number
1   12,34,45,55,67,66,5,7
2   45,55,67,89,777
3   23,45,67,88,777,8888,564
4   1,234,567,890,987,650,000,000
5   222,233,345,645,634,000
6   33,44,55,66,77
7   12,34,22,88,99

我正在寻找的预期输出

Id  Number
1   12
1   34
1   45
1   55
1   67
1   66
1   5
1   7
2   45
2   55
2   67
2   89
2   777

我有 accessdb 而没有其他数据库。请求您帮助我解决这个问题,因为我不知道 Accessdb。如果您需要更多详细信息,请告诉我。

这是我在 Access db 查询中编写的查询,所以它会根据数字 Id 在另一个表中进行更新。

SELECT  t1.Id
        , t2.NUMBER 
FROM    table 1 AS t1 INNER JOIN table2 AS t2 ON t1.number LIKE t2.number & '*';

【问题讨论】:

您好,能否让我们看看您已经尝试过的SQLVBA 代码? 这是我在 access db 查询中编写的查询,所以它会根据数字 Id 在另一个表中进行更新。 SELECT t1.Id, t2.NUMBER FROM table 1 AS t1 INNER JOIN table2 AS t2 ON t1.number LIKE t2.number & '*'; 【参考方案1】:

这是一项相当复杂的任务,但可以通过创建 VBA 函数来获取特定位置的项目,然后交叉连接预先填充的连续序列表或序列生成查询来实现。

首先,我们声明 VBA 函数(来自here,我告诉你为什么不能在那里使用 SQL):

Public Function SplitString(str As String, delimiter As String, count As Integer) As Variant
    Dim strArr() As String
    strArr = Split(str, delimiter, count + 1)
    count = count - 1 'zero-based
    If UBound(strArr) >= count Then
        SplitString = strArr(count)
    End If
End Function

然后,我们将其与生成表/查询的序列一起使用来拆分字符串。在我的示例中,我将使用this query by Gustav 作为序列生成器:

SELECT MyTable.ID,  SplitString(MyTable.[Number], ",", Sequence.[Value]) As [Number]
FROM 
    MyTable,
    (
        SELECT DISTINCT 
        [Tens]+[Ones] + 1 AS [Value], 
        10*Abs([Deca].[id] Mod 10) AS Tens, 
        Abs([Uno].[id] Mod 10) AS Ones
        FROM 
            msysobjects AS Uno, 
            msysobjects AS Deca;
    ) As Sequence
WHERE SplitString(MyTable.[Number], ",", Sequence.[Value]) Is Not Null

【讨论】:

【参考方案2】:

我认为最明显的初始问题是为什么要在一个字段中存储多个“数字”:这违背了使用关系数据库(甚至是 Access)的全部意义。您是否有理由将逗号分隔的值存储在一个字段中?将每个“数字”存储在单独的字段中肯定会使您的查询更容易构建。

另一个问题:存储的一些数字是“000”。这些是有效代码,还是表示没有价值(即空值)?在您的输出中如何处理它们?

如果可能的话,我认为您最好创建 2 个单独的表:一个用于存储 ID(和其他相关属性),另一个用于存储每个实体的 ID。例如:tEntity 可以存储每个实体的 ID(和名称)。 tEntityValues 将为与实体相关联的每个数字/代码有一个单独的行。然后,您的查询会简单得多。

【讨论】:

以上是关于访问数据库查询以将由“,”分隔的列拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询将分隔字符串值拆分为单独的列[重复]

关于在Hive中将特定字符分隔的字符串拆分成多行的应用

Hive - 在多行上拆分分隔列,根据位置选择

将一串空格分隔的单词拆分为多行[重复]

将分隔列拆分为另一个表中的单独行的高效查询

如何拆分对象列表以分隔pyspark数据框中的列