-
01-07-2019 - |
문제
SQL Server의 COALESCE 기능에 해당하는 Access 2007을 찾고 있습니다.
SQL Server에서는 다음과 같은 작업을 수행할 수 있습니다.
사람
John
Steve
Richard
SQL
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
다음을 생성합니다.존, 스티브, 리차드
저도 똑같이 하고 싶지만 Access 2007에서는요.
Access 2007에서 이와 같은 행을 결합하는 방법을 아는 사람이 있습니까?
해결책
다음은 샘플 사용자 정의 함수(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;
onedaywhen의 댓글에서 영감을 받은 ADO 버전
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.lessthhandot.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가 아니라 변수에 대한 연결입니다.
안타깝게도 이는 단일 SQL 문이어야 하고 변수를 선언할 수 있는 기능이 없는 Access 쿼리 내에서는 불가능합니다.
결과 집합을 열고, 반복하고, 행 값을 문자열로 연결하는 함수를 만들어야 할 것 같습니다.
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
오류 처리 코드를 추가하고 레코드 세트를 정리해야 하며 DAO 대신 ADO를 사용하면 약간 변경되지만 일반적인 아이디어는 동일합니다.
여기서는 3개의 레코드가 있는 "person" 테이블이 있다는 것을 이해합니다.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
이 배열(2차원 배열)이 있으면 이를 조작하여 필요한 "열"을 추출할 수 있습니다.여기에서 1차원 배열을 추출하는 현명한 방법이 있을 수 있으므로 "Join" 명령을 사용하여 각 배열 값을 하나의 문자열로 연결할 수 있습니다.