访问数据库查询以将由“,”分隔的列拆分为多行
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 & '*';
【问题讨论】:
您好,能否让我们看看您已经尝试过的SQL
或VBA
代码?
这是我在 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
将为与实体相关联的每个数字/代码有一个单独的行。然后,您的查询会简单得多。
【讨论】:
以上是关于访问数据库查询以将由“,”分隔的列拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章