Выбор похожих имен столбцов, имеющих общий текст в SQL-запросе - PullRequest
0 голосов
/ 09 октября 2019

Я импортирую файл CSV с сетевого диска, на котором есть много столбцов, содержащих текст SG_. В настоящее время я переименовываю эти столбцы с помощью кода, выполнив 1-й запрос, чтобы создать набор записей со 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. В настоящее время я использую Microsoft Access Text Driver в Excel, используя VBA.

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      |

Есть ли способ выбрать эти столбцы?

1 Ответ

0 голосов
/ 09 октября 2019

Нет прямого пути к достижению чего-то подобного. Вам придется либо изменить код 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, необходимый для ваших данных.

...