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

时间:2018-06-26 10:23:53

标签: ms-access access-vba

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

var containsNumbers = s.Any(c=>Char.IsNumber(c));
var isNumber = s.All(c=>Char.IsNumber(c));

我正在寻找的预期输出

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

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

这是我在Access db查询中编写的查询,因此它的作用是根据ID在另一个表中正在更新的数字。

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

2 个答案:

答案 0 :(得分:0)

这是一个非常复杂的任务,但可以通过创建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中的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

答案 1 :(得分:0)

我认为显而易见的初始问题是,为什么要在一个字段中存储多个“数字”:这与使用关系数据库(甚至是Access)的观点背道而驰。您将一个逗号分隔的值存储在一个字段中是有原因的吗?将每个“数字”存储在单独的字段中肯定会使您的查询更易于构建。

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

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