繁体   English   中英

Microsoft Access SQL查询中的字符串串联问题

[英]Problem with string concatenation in Microsoft Access SQL query

我在Access 2016数据库中有一个表,其中包含几个位置的信息。 每个位置均以以下三种格式之一存储:

(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函数,因此我一直CONCAT_WS() ,试图找到一种解决方法来连接字符串,同时消除null字段的多余空格。

这是我的桌子的一个样本:

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;

这是我在上表中运行查询时得到的结果:

|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的预期。在该论坛的另一篇文章( MS Access中的CONCAT等效 )中,有人建议如果使用+进行串联将创建空字符串(如果用于将字符串与另一个null串联在一起的话)。我尝试过,但是第一行仍然给我带来悲伤。 对于类型2或4,查询根本不起作用。 谁能阐明我在哪里犯错误? 我对SQL相当熟悉,但是对Access支持它的有限方式感到沮丧。 (顺便说一句,如果用户未输入实际地址,默认情况下,创建此数据的程序将使用<UNKNOWN>作为地址的占位符,因此该地址会出现在相关表的许多记录中)。

您可以使用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, "")
                   ),
              . . .
              )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM