Объединение строк / строк конкатенации

Я ищу Access 2007, эквивалентный функции COALESCE SQL Server.

В SQL Server вы можете сделать что-то вроде:

Человек

John Steve Richard 

SQL

 DECLARE @PersonList nvarchar(1024) SELECT @PersonList = COALESCE(@PersonList + ',','') + Person FROM PersonTable PRINT @PersonList 

Который производит: Джон, Стив, Ричард

Я хочу сделать то же самое, но в Access 2007.

Кто-нибудь знает, как объединить строки, подобные этому в Access 2007?

    Вот пример User Defined Function (UDF) и возможное использование.

    Функция:

     Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant) Dim db As Database Dim rs As DAO.Recordset Dim strList As String Set db = CurrentDb If strSQL <> "" Then Set rs = db.OpenRecordset(strSQL) Do While Not rs.EOF strList = strList & strDelim & rs.Fields(0) rs.MoveNext Loop strList = Mid(strList, Len(strDelim)) Else strList = Join(NameList, strDelim) End If Coalsce = strList End Function 

    Применение:

     SELECT documents.MembersOnly, Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who, Coalsce("",":","Mary","Joe","Pat?") AS Others FROM documents; 

    Версия ADO, вдохновленная комментарием onedaywhen

     Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant) Dim rs As New ADODB.Recordset Dim strList As String On Error GoTo Proc_Err If strSQL <> "" Then rs.Open strSQL, CurrentProject.Connection strList = rs.GetString(, , strColDelim, strRowDelim) strList = Mid(strList, 1, Len(strList) - Len(strRowDelim)) Else strList = Join(NameList, strColDelim) End If ConcatADO = strList Exit Function Proc_Err: ConcatADO = "***" & UCase(Err.Description) End Function 

    От: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29

    Я думаю, что Nz – это то, что вам нужно, синтаксис – Nz(variant, [if null value]) . Вот ссылка на документацию: Функция Nz

     ---Person--- John Steve Richard DECLARE @PersonList nvarchar(1024) SELECT @PersonList = Nz(@PersonList + ',','') + Person FROM PersonTable PRINT @PersonList 

    Хотя Nz делает сопоставимую вещь с COALESCE, вы не можете использовать ее в Access для выполнения операции, которую вы выполняете. Это не COALESCE, который строит список значений строк, это конкатенация в переменную.

    К сожалению, это невозможно в запросе Access, который должен быть единственным оператором SQL и где нет возможности объявлять переменную.

    Я думаю, вам нужно создать функцию, которая будет открывать набор результатов, перебирать его и конкатенировать значения строк в строку.

    Чтобы объединить строки в Access, вам, вероятно, понадобится код, который выглядит примерно так:

     Public Function Coalesce(pstrTableName As String, pstrFieldName As String) Dim rst As DAO.Recordset Dim str As String Set rst = CurrentDb.OpenRecordset(pstrTableName) Do While rst.EOF = False If Len(str) = 0 Then str = rst(pstrFieldName) Else str = str & "," & rst(pstrFieldName) End If rst.MoveNext Loop Coalesce = str End Function 

    Вы хотите добавить код обработки ошибок и очистить свой набор записей, и это немного изменится, если вы используете ADO вместо DAO, но общая идея такая же.

    Я понимаю здесь, что у вас есть таблица «человек» с 3 записями. Ничего не сравнимо с тем, что вы описали в Access.

    В «стандартном» доступе (набор записей DAO) вам придется открыть набор записей и использовать метод getrows для получения ваших данных

     Dim rs as DAO.recordset, _ personList as String, _ personArray() as variant set rs = currentDb.open("Person") set personArray = rs.getRows(rs.recordcount) rs.close 

    если у вас есть этот массив (он будет двумерным), вы можете манипулировать им, чтобы извлечь «столбец», который вам понадобится. Возможно, есть разумный способ извлечения одномерного массива из этого, поэтому вы можете использовать команду «Присоединить», чтобы объединить каждое значение массива в одну строку.

    Interesting Posts

    как resize растрового изображения на iOS

    Как записать в экранное меню KDE или уведомление с консоли?

    Как передать параметры для Android-намерения в новой схеме на хром?

    Сделать терминал распознавать PageUp и PageDown при переназначении на разные клавиши

    Проект Android Studio Gradle «Невозможно запустить процесс / инициализацию виртуальной машины»

    Преобразование матрицы данных в матрицу отсутствия присутствия

    Explorer.exe сбой при нажатии правой кнопкой мыши на файл .ts

    Имя терминала / вкладки

    Как преобразовать объект Java (bean) в пары ключ-значение (и наоборот)?

    Очень длинный процесс загрузки?

    Получение DrawerLayout для перемещения по ActionBar

    Mac OS X Yosemite – Как отключить автоматический выход из системы в режиме ожидания?

    Выбор элемента текстового поля в списке не изменяет выбранный элемент списка

    Что может привести к тому, что ЖК-панель станет слегка тусклой и слегка размытой?

    Как я могу использовать classы стандартной библиотеки (STL) в моем интерфейсе dll или ABI?

    Давайте будем гением компьютера.