Microsoft Access SQL 查询中的字符串连接问题
Problem with string concatenation in Microsoft Access SQL query
我在 Access 2016 数据库中有一个 table,其中包含多个位置的信息。每个位置都以三种格式之一存储:
(type 1) standard US address with house number
(type 2) street intersection
(type 4) GPS coordinates only
(type 3 is not used in this database).
我正在尝试通过查询将各个字段值连接成单个字符串,以便我可以在报表的文本框中显示该字符串。类型 1 的格式是
[HouseNumber],[HouseNumberSuffix],[PrefixDirectional],[StreetName],[StreetType],[Qualifier],[City]
在下面的示例中,第 2 行看起来像“100 E UNION ST, SOMERSET”。
类型 2 的格式是
[PrefixDirectional],[StreetName],[StreetType],'/',[XPrefixDirectional],[XStreetName],[XStreetType]
在下面的示例中,第 3 行应该看起来像“N CENTER AVE/E MAIN ST”。
类型 3 的格式是
[LatitudeY],"|",[LongitudeX]
在下面的示例中,第 6 行应该类似于“39.957384|-78.824255”。
类型 1 和类型 2 由生成此数据的应用程序进行地理编码,因此它们还包括 Lat 和 Long 值(如果可用),但在连接这些行时我不需要考虑这些字段。在此实现中,许多字段包含空值。由于 Microsoft Access 不支持 CONCAT_WS()
SQL 函数,我一直在绞尽脑汁试图找到一种解决方法来连接字符串,同时消除空字段的额外空格。
这是我的示例 table:
Table: Dim_Address
|AddressID|LocationType|HouseNumber|HouseNumberSuffix|PrefixDirectional|StreetName |StreetType|XPrefixDirectional|XStreetName|XStreetType|Qualifier|City |LatitudeY |LongitudeX |
|---------|------------|-----------|-----------------|-----------------|----------------|----------|------------------|-----------|-----------|---------|----------|------------|-------------|
|1 |1 | | | |<UNKNOWN> | | | | | | | | |
|12 |1 |100 | |E |UNION |ST | | | | |SOMERSET |40.0092574 |-79.078380702|
|37 |2 | | |N |CENTER |AVE |E |MAIN |ST | |SOMERSET |40.008420389|-79.078610673|
|6363 |4 | | | | | | | | | |SOMERSET |39.996243 |-79.034395 |
|9302 |2 | | | |MARKLETON SCHOOL|RD | |ROCKDALE |RD | |ROCKWOOD |39.908031106|-79.160141687|
|9725 |4 | | | | | | | | | |BERLIN |39.957384 |-78.824255 |
|8282 |1 |222 | | |MAIN |ST | | | |APT 13 |MEYERSDALE|39.814387822|-79.026677269|
|55233 |1 |2110 |1/2 | |GRAHAM |AVE | | | | |WINDBER |40.230844268|-78.82551539 |
[AddressID]
、[LocationType]
、[HouseNumber]
是整数; [LatitudeY]
和 [LongitudeX]
是双打;其余字段都是字符串。
这是我在查询中尝试使用的代码:
SELECT
Switch(
[LocationType]=1,((CStr([HouseNumber])+' ') & ([HouseNumberSuffix]+' ') & ([PrefixDirectional]+' ') & ([StreetName]+' ') & [StreetType] & (', '+[Qualifier]) & (', '+[VenueName])),
[LocationType]=2,(([PrefixDirectional]+' ') & ([StreetName]+' ') & ([StreetType]+' ') & ('/') & ([XPrefixDirectional]+' ') & ([XStreetName]+' ') & ([XStreetType]+' ')),
[LocationType]=4,(CStr([LatitudeY]) & ' | ' & CStr([LongitudeX]))
) AS LocationConcatenation
FROM Dim_Address;
这是我 运行 上面 table 的查询时得到的结果:
|LocationConcatenation |
|-------------------------------|
|#Error |
|100 E UNION ST, SOMERSET |
|#Error |
|#Error |
|#Error |
|#Error |
|222 MAIN ST, APT 13, MEYERSDALE|
|2110 1/2 GRAHAM AVE, WINDBER |
除第 1 行外,它完全按照类型 1 的预期工作。在本论坛的另一个 post (CONCAT equivalent in MS Access) 上,有人建议使用 + 进行连接会创建空字符串,如果使用的话将一个字符串与另一个 null 连接起来,所以我试过了,但第 1 行仍然让我感到悲伤。对于类型 2 或 4,查询根本不起作用。谁能阐明我在哪里犯了错误?我对 SQL 相当熟悉,但对 Access 支持它的方式有限感到沮丧。 (顺便说一句,如果用户未输入实际地址,则默认情况下,创建此数据的程序使用 作为地址的占位符,因此它出现在相关 table 的许多记录中)。
您可以使用 nz()
、ltrim()
和条件逻辑在 MS Access 中实现 concat_ws()
的等价物:
select Switch(LocationType = 1,
ltrim(nz(" " + CStr(HouseNumber), "") +
nz(" " + HouseNumberSuffix, "") +
nz(" " + PrefixDirectional, "") +
nz(" " + StreetName, "") +
nz(" " + StreetType, "") + ", " &
nz(" " + Qualifier, "") + ", "
nz(" " + VenueName, "")
),
. . .
)
我在 Access 2016 数据库中有一个 table,其中包含多个位置的信息。每个位置都以三种格式之一存储:
(type 1) standard US address with house number
(type 2) street intersection
(type 4) GPS coordinates only
(type 3 is not used in this database).
我正在尝试通过查询将各个字段值连接成单个字符串,以便我可以在报表的文本框中显示该字符串。类型 1 的格式是
[HouseNumber],[HouseNumberSuffix],[PrefixDirectional],[StreetName],[StreetType],[Qualifier],[City]
在下面的示例中,第 2 行看起来像“100 E UNION ST, SOMERSET”。
类型 2 的格式是
[PrefixDirectional],[StreetName],[StreetType],'/',[XPrefixDirectional],[XStreetName],[XStreetType]
在下面的示例中,第 3 行应该看起来像“N CENTER AVE/E MAIN ST”。
类型 3 的格式是
[LatitudeY],"|",[LongitudeX]
在下面的示例中,第 6 行应该类似于“39.957384|-78.824255”。
类型 1 和类型 2 由生成此数据的应用程序进行地理编码,因此它们还包括 Lat 和 Long 值(如果可用),但在连接这些行时我不需要考虑这些字段。在此实现中,许多字段包含空值。由于 Microsoft Access 不支持 CONCAT_WS()
SQL 函数,我一直在绞尽脑汁试图找到一种解决方法来连接字符串,同时消除空字段的额外空格。
这是我的示例 table:
Table: Dim_Address
|AddressID|LocationType|HouseNumber|HouseNumberSuffix|PrefixDirectional|StreetName |StreetType|XPrefixDirectional|XStreetName|XStreetType|Qualifier|City |LatitudeY |LongitudeX |
|---------|------------|-----------|-----------------|-----------------|----------------|----------|------------------|-----------|-----------|---------|----------|------------|-------------|
|1 |1 | | | |<UNKNOWN> | | | | | | | | |
|12 |1 |100 | |E |UNION |ST | | | | |SOMERSET |40.0092574 |-79.078380702|
|37 |2 | | |N |CENTER |AVE |E |MAIN |ST | |SOMERSET |40.008420389|-79.078610673|
|6363 |4 | | | | | | | | | |SOMERSET |39.996243 |-79.034395 |
|9302 |2 | | | |MARKLETON SCHOOL|RD | |ROCKDALE |RD | |ROCKWOOD |39.908031106|-79.160141687|
|9725 |4 | | | | | | | | | |BERLIN |39.957384 |-78.824255 |
|8282 |1 |222 | | |MAIN |ST | | | |APT 13 |MEYERSDALE|39.814387822|-79.026677269|
|55233 |1 |2110 |1/2 | |GRAHAM |AVE | | | | |WINDBER |40.230844268|-78.82551539 |
[AddressID]
、[LocationType]
、[HouseNumber]
是整数; [LatitudeY]
和 [LongitudeX]
是双打;其余字段都是字符串。
这是我在查询中尝试使用的代码:
SELECT
Switch(
[LocationType]=1,((CStr([HouseNumber])+' ') & ([HouseNumberSuffix]+' ') & ([PrefixDirectional]+' ') & ([StreetName]+' ') & [StreetType] & (', '+[Qualifier]) & (', '+[VenueName])),
[LocationType]=2,(([PrefixDirectional]+' ') & ([StreetName]+' ') & ([StreetType]+' ') & ('/') & ([XPrefixDirectional]+' ') & ([XStreetName]+' ') & ([XStreetType]+' ')),
[LocationType]=4,(CStr([LatitudeY]) & ' | ' & CStr([LongitudeX]))
) AS LocationConcatenation
FROM Dim_Address;
这是我 运行 上面 table 的查询时得到的结果:
|LocationConcatenation |
|-------------------------------|
|#Error |
|100 E UNION ST, SOMERSET |
|#Error |
|#Error |
|#Error |
|#Error |
|222 MAIN ST, APT 13, MEYERSDALE|
|2110 1/2 GRAHAM AVE, WINDBER |
除第 1 行外,它完全按照类型 1 的预期工作。在本论坛的另一个 post (CONCAT equivalent in MS Access) 上,有人建议使用 + 进行连接会创建空字符串,如果使用的话将一个字符串与另一个 null 连接起来,所以我试过了,但第 1 行仍然让我感到悲伤。对于类型 2 或 4,查询根本不起作用。谁能阐明我在哪里犯了错误?我对 SQL 相当熟悉,但对 Access 支持它的方式有限感到沮丧。 (顺便说一句,如果用户未输入实际地址,则默认情况下,创建此数据的程序使用
您可以使用 nz()
、ltrim()
和条件逻辑在 MS Access 中实现 concat_ws()
的等价物:
select Switch(LocationType = 1,
ltrim(nz(" " + CStr(HouseNumber), "") +
nz(" " + HouseNumberSuffix, "") +
nz(" " + PrefixDirectional, "") +
nz(" " + StreetName, "") +
nz(" " + StreetType, "") + ", " &
nz(" " + Qualifier, "") + ", "
nz(" " + VenueName, "")
),
. . .
)