【问题标题】:Selecting similar Column names having common text in SQL Query在 SQL Query 中选择具有相同文本的相似列名
【发布时间】:2020-02-07 04:31:31
【问题描述】:

我正在从网络驱动器导入 CSV,该驱动器有很多包含文本 SG_ 的列。我目前正在通过代码重命名这些列,方法是运行第一个查询以创建具有SELECT TOP 1* FROM FILENAME.EXT 行的记录集。然后我循环recordset.Fields 并删除前缀文本,例如nnn_ 使用 MID Function 并使用剩余的文本将它们用作 Aliases 用于这些 SG 列。所以我的第一个 VBA 创建的 SQL 字符串如下所示:

StrSQL = "SELECT [Food],[Bev],[Meds],[Average 1],[Midpoint],[Average 2],[SG_ABC],[SG_DEF],[SG_GHI]

由此,我想选择包含SG_ 的列。

示例 VBA 代码:

Set oCon = CreateObject("ADODB.Connection")
Set oRs = CreateObject("ADODB.Recordset")
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & sFullDirectory & ";Extensions=asc,csv,tab,txt;HDR=Yes;"        

strSQL = "SELECT TOP 1 * FROM " & FILE1
oCon.Open strCon
Set oRs = oCon.Execute(strSQL)

i = 1
strSQL = "SELECT "

For Each Fld In oRs.Fields
    Select Case True
     Case Is = InStr(1, Fld.Name,"SG_") > 0
       TempSG=Trim(Mid(Fld.Name,InStr(1,Fld.Name,"SG_"),Len(Fld.Name)))
       strSQL = strSQL & " CDbl([" & Fld.Name & "]) AS [" & TempSG & "], "
....more Cases...

  End Select
Next Fld

oRs.Close
....more code.

然后我将此strSQL 查询加入其他表,以选择其他列并将结果加载到 ado 记录集。我目前正在使用 VBA 在 Excel 中使用 Microsoft Access 文本驱动程序

strSQL1 = "SELECT  G.[lbl], A.[tval], Q.*"
strSQL1 = strSQL1 & " FROM "
strSQL1 = strSQL1 & " (SELECT G.[pos], A.[pos], G.[lbl], A.[tval] FROM " & FILE2 & "  G," & FILE3 & " A WHERE G.[ID] = A.[ID])  T, (" & strSQL & ")  Q "
strSQL1 = strSQL1 & " WHERE (CLng(T.[G].[pos]) = CLng(Q.[gval])) AND (CLng(T.[A].[pos]) = CLng(Q.[pos]))"
strSQL1 = strSQL1 & " ORDER BY CLng(Q.[gval]), CDbl(Q.[Aggregate 1]) DESC, G.[lbl];"

Set oRs = oCon.Execute(strSQL1)

在上面的代码中,Q.* 代表下表,我只想从中选择 SG_ 列。希望这能让事情变得清楚。例如

SELECT  G.[lbl], A.[tval], Q.* LIKE 'SG_'

CSV 表格:

Food   |  Bev |  Meds | Average |  Midpoint  |  Average  | 434_SG_ABC | 236_SG_DEF | 121_SG_GHI  |
--------------------------------------------------------------------------------------------------
cheese | Rum  |  cold | 1.22    |  4.98      |   0.24    |  23.43     |  54.67     |  89.33      |
Butter | Wine |  heat | 3.56    |  2.40      |   0.98    |  12.12     |  90.23     |  33.43      |
Olive  | Beer |  rain | 4.33    |  7.11      |   1.45    |  11.55     |  10.31     |  87.22      |
Rice   | Gin  |  hail | 2.02    |  7.86      |   3.36    |  25.82     |  29.44     |  65.70      |

有没有办法选择这些列?

【问题讨论】:

  • 构建动态查询需要多少列?数百?
  • @Parfait 这取决于客户的预测。大多数 csv 可能在列中显示 30-40 个 SGroup。但有些可能只有 5 个。所以它每次都会变化。
  • 您需要将 CSV 清理为您需要的格式,然后使用依赖结构化数据的 SQL 进行处理。

标签: sql excel vba odbc sql-like


【解决方案1】:

没有直接的方法可以实现这样的目标。 您要么必须修改 VBA 代码以生成具有所需列的字符串。 或者,如果无法更改 VBA,则将数据插入临时表中,然后生成动态查询以选择所需数据

DECLARE @query NVARCHAR(MAX) = ''
SELECT @query = @query + ',' + name
FROM sys.columns
WHERE object_name(object_id) = '<Your Staging table name>'
AND name like 'sg%'

SET @query = 'SELECT ' + RIGHT(@query, LEN(@query)-1) + '
INTO <whichever permanent or temp table you need>
FROM <Your Staging table name>'

EXEC(@query)

这将为您提供详细信息所需的 Select 语句。

【讨论】:

  • 我正在使用 Excel 和 VBA 来创建 SQL 查询。
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2014-07-14
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多