无法连接字符串列

时间:2017-04-04 08:36:22

标签: sql-server

我想连接三个栏目 - 街道,街道号码和城市到一列"地址"。奇怪的是,我出于某种原因不能这样做。

这是我到目前为止所尝试的:

SELECT      street,
            street_num,
            city,
            isnull(street,'') + '' + isnull(street_num,'') + '' + isnull(city,'') AS tst1, --doesnt work
            concat(isnull(street,''),' ',isnull(street_num,''), ' ', isnull(city,'')) AS tst2, --doesnt work
            (street_num + ' ' + street) AS tst3, --does work
            (street_num + ' ' + city) AS tst4, --does work
            (city + ' ' + street) AS tst5 --doesnt work
FROM        [DB].[dbo].[adresses]

请注意,+concat不起作用,它只显示这些情况下的第一列,街道。但是,如果我从街道号码开始并添加街道或城市,它确实有效。但是,如果我尝试添加第三列,则不会显示。

如果有帮助,该表是通过OPENQUERY从Oracle中提取的,表结构如下:

street VARCHAR(100), null
street_num VARCHAR(50), null
city VARCHAR(100), null

我在MSSQL 2014上。

修改

正如评论中所述,当我处理客户地址时,我无法显示数据。以下是两个虚拟记录加上预期结果(地址)作为示例:

street            | street_num | city   | adress
--------------------------------------------------------------------
avenida pino alto | 45         | avila  | avenida pino alto 45 avila  
rue de abaixo     | 86         | madrid | rue de abaixo 86 madrid        

此外,如果我复制记录并做这样的事情,它当然有效。

SELECT 'avenida pino alto' + ' ' + '45' + ' ' + 'avila'

3 个答案:

答案 0 :(得分:1)

根据评论,您的street列似乎包含一些导致问题的字符/数据。

我不知道它可能是什么,但你可以尝试找出这样的结果:

select top 10
    street,
    len(street) as streetCharLen,
    cast(street as varbinary(500)) as streetBytes
from [DB].[dbo].[adresses]

然后比较不同栏目告诉你的内容。

这是一个快速示例:

declare @t table (
    id int,
    thestring varchar(50)
)

insert into @t values (1, 'test')

select thestring,
    len(thestring) as slen,
    cast(thestring as varbinary(100)) as sbytes
from @t

如果在此示例中,slen不是4,或者sbytes包含的某些内容未映射回我在选择时看到的其中一个字符,则字符串出现问题

答案 1 :(得分:0)

使用convert(varchar,[exp]):

SELECT      street,
            street_num,
            city,
            isnull(convert(varchar,street),'') + '' + isnull(convert(varchar,street_num),'') + '' + isnull(convert(varchar,city),'') AS tst1

FROM        [DB].[dbo].[adresses]

答案 2 :(得分:0)

请尝试以下操作。

    select isnull((convert varchar(250),street),'')+isnull((convert varchar(250),[street number]),'')+
    isnull((convert varchar(250),[city]),'') as 'Adress'
    from .......(your query)