【问题标题】:SQL query to extract strings from comma delimited string从逗号分隔的字符串中提取字符串的 SQL 查询
【发布时间】:2020-11-27 09:10:51
【问题描述】:

我想使用 VBA 从 MS Access 数据库中提取数据到 MS Excel。

我知道要提取的代码,但在操作列时遇到问题。

我想提取第一个逗号之前的字符串,然后提取第二个和第三个逗号之前的字符串,然后提取第三个逗号之后的字符串。

举个例子。假设我有一个名为 fruits 的列,它的数据为

Banana,Apple,Orange,Grapes

我想创建四列,第一列是香蕉,第二列是苹果,第三列是橙色,第四列是葡萄。

以下是我为第一列尝试的内容。

SQL = "SELECT SUBSTRING(Fruits,0,CHARINDEX(',',Fruits) as column1 from tablename"

【问题讨论】:

  • 这里的最佳建议是停止在表中存储 CSV 字符串,尤其是当您将每个 CSV 值视为单个数据点时。相反,将每个水果串放在单独的记录上。水果喜欢有一些喘息的空间!
  • 由于某些限制,我们无法在表上创建更多列。所以,寻找这些操作来获取我的 excel 上的数据。

标签: sql vba ms-access


【解决方案1】:

你可以创建一个小辅助函数并使用Split

Public Function GetField( _
    ByVal AllFields As String, _
    ByVal Index As Integer) _
    As String
    
    GetField = Split(AllFields, ",")(Index)
    
End Function

然后:

SQL = "Select GetField([Fruit], 0) As Fruit From YourTable"

【讨论】:

  • 当我在一个过程中使用 vba 运行这个 SQL 查询时.. 它说函数不存在。我还在外面创建了小助手函数。
  • 如果位于代码模块中,编译保存,应该是可达的。
  • 它说未定义的功能.. 我已经保存在同一个模块中
  • 与..相同的模块?但是,尝试创建一个新模块并将函数移至此。
【解决方案2】:

试试这个:

DECLARE @Data NVARCHAR(MAX) = 'Banana,Apple,Orange,Grapes'

DECLARE @DataXML XML = '<a>' + REPLACE('Banana,Apple,Orange,Grapes', ',', '</a><a>') + '</a>'

SELECT *
FROM
(
    SELECT T.c.value('.','varchar(255)')
          ,ROW_NUMBER() OVER (ORDER BY T.c)
    FROM @DataXML.nodes('/a') T(c)
) DS ([value], [col])
PIVOT
(
    MAX([value]) FOR [col] IN ([1], [2], [3], [4])
) PVT

SELECT 'Banana,Apple,Orange,Grapes'
 AS [my_column]
INTO [my_table]


WITH DataSource (DataXML) AS
(
    SELECT CAST('<a>' + REPLACE([my_column], ',', '</a><a>') + '</a>' AS XML)
    FROM [my_table] 
)

SELECT *
FROM
(
    SELECT T.c.value('.','varchar(255)')
          ,ROW_NUMBER() OVER (ORDER BY T.c)
    FROM DataSource
    CROSS APPLY [DataXML].nodes('/a') T(c)
) DS ([value], [col])
PIVOT
(
    MAX([value]) FOR [col] IN ([1], [2], [3], [4])
) PVT

【讨论】:

  • 我们不能声明变量,因为我的数据库中有一个字段有数千行。我想根据字段名写一个查询然后提取。
  • @PraveenKUMAR 如果您不想声明变量,可以使用 CTE。你想告诉你怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多