Search code examples
sqlms-access

How do I query multiple fields into one


I am trying to create a query that returns each comma-separated value into one column

TEXT
A1,A2,A3
X,D3,PP
FF
DF(a),R

This is what I have tried. Below script extracts each comma-separated value (which is never more than 3) into 3 columns and tries to UNION THEM

SELECT IIf(InStr([A],",")='0',[A],Left([A],InStr([A],",")-1))  FROM Tbl
UNION ALL
SELECT  IIf(InStr([A],",")='0','',Mid([A],InStr([A],",")+'1',Len([A])-InStr(Len(IIf(InStr([A],",")='0',[A],Left([A],InStr([A],",")-1)))+'2',[A],","))) FROM Tbl
UNION ALL
SELECT  IIf(InStr(Len(IIf(InStr([A],",")='0',[A],Left([A],InStr([A],",")-1)))+'2',[A],",")='0','',Mid([A],InStr(Len(IIf(InStr([A],",")='0',[A],Left([A],InStr([A],",")-1)))+'2',[A],",")+1)) FROM Tbl;

When running the query I get an error Data type mismatch in criteria expression The formulas work correct in the following query

SELECT [Tbl].A, 
IIf(InStr([A],",")='0',[A],Left([A],InStr([A],",")-1)) AS a, 
IIf(InStr([A],",")='0','',Mid([A],InStr([A],",")+'1',Len([A])-InStr(Len([a])+'2',[A],","))) AS b, 
IIf(InStr(Len([a])+'2',[A],",")='0','',Mid([A],InStr(Len([a])+'2',[A],",")+1)) AS c
FROM Tbl;

The desired outcome should be:

TEXT
A1
A2
A3
X
D3
PP
FF
DF(a)
R

Solution

  • Numbers are not text, so remove the quotes:

    SELECT IIf(InStr([A],",")=0,[A],Left([A],InStr([A],",")-1)) 
    FROM Tbl
    UNION ALL
    SELECT IIf(InStr([A],",")=0,'',Mid([A],InStr([A],",")+1,Len([A])-InStr(Len(IIf(InStr([A],",")=0,[A],Left([A],InStr([A],",")-1)))+2,[A],","))) 
    FROM Tbl
    UNION ALL
    SELECT IIf(InStr(Len(IIf(InStr([A],",")=0,[A],Left([A],InStr([A],",")-1)))+2,[A],",")=0,'',Mid([A],InStr(Len(IIf(InStr([A],",")=0,[A],Left([A],InStr([A],",")-1)))+2,[A],",")+1)) 
    FROM Tbl;