如何使用T-SQL正确连接列?

时间:2011-03-08 16:37:21

标签: sql-server-2005 tsql

我在表格中的多个列中有一个地址。

SELECT FirstName, LastName, StreetAddress, City, Country, PostalCode 
FROM Client

我正在尝试使用逗号(,)作为分隔符将地址相关列连接到一个字段中,但如果任何列“例如.City”为空或空,则逗号不应该在那里。

如何在cQL中使用TSQL中的三元运算符? 或者建议我最好的做法?

由于

6 个答案:

答案 0 :(得分:38)

当您使用null连接任何内容时,它将返回null。所以我试图用给定的列值连接一个逗号,如果该表达式返回null,我使用Coalesce返回一个空字符串。最后,如果我得到一个值,整个结果将以逗号开头。所以我使用Stuff函数删除了这个逗号。

Select Stuff(
    Coalesce(',' + FirstName,'')
    + Coalesce(',' + LastName,'')
    + Coalesce(',' + StreetAddress,'')
    + Coalesce(',' + City,'')
    + Coalesce(',' + Country,'')
    + Coalesce(',' + PostalCode ,'')
    , 1, 1, '')
From Client

如果您只想要地址,那么显然您只需要包含这些列:

Select FirstName, LastName
    , Stuff(
        Coalesce(',' + StreetAddress,'')
        + Coalesce(',' + City,'')
        + Coalesce(',' + Country,'')
        + Coalesce(',' + PostalCode ,'')
    , 1, 1, '')
From Client

答案 1 :(得分:28)

如果您在NULLIF函数中包含COALESCE函数,它将适用于空列和NULL

SELECT FirstName,
       LastName,
       STUFF(
           COALESCE(',' + NULLIF(StreetAddress, ''), '')  + 
           COALESCE(',' + NULLIF(City, ''), '') +
           COALESCE(',' + NULLIF(Country, ''), '') +
           COALESCE(',' + NULLIF(PostalCode , ''), ''),
           1, 1, '') AS "Address"
   FROM Client

答案 2 :(得分:4)

看看isnull

您还可以查看使用COALESCE功能,请在BOL中查找:

  

返回第一个非空表达式   在其论点中。

最后,您可以做的另一件事是使用CASE函数。

SELECT Address1, CASE Address2 IS NOT NULL THEN "," + Address2 ELSE...

答案 3 :(得分:1)

您可以使用Case-Expression

create table #Client(
FirstName varchar(20), 
LastName varchar(50), 
StreetAddress varchar(50), 
City varchar(20), 
Country varchar(20), 
PostalCode varchar(20)
)
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Jeff','Bridges','Street1','City1','US','12345')
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Steven','Baldwin','Street2','City2','US','12345')
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Barack','Obama','Street3',NULL,'US','12345')
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Nora','Jones','Street4','City4','US','12345')

SELECT FirstName, LastName,
(CASE WHEN City IS NULL AND StreetAddress IS NULL THEN '' 
      WHEN City IS Null AND StreetAddress IS NOT NULL Then StreetAddress 
      WHEN City IS NOT Null AND StreetAddress IS NOT NULL THEN StreetAddress + ',' + City END
)AS Adress, Country, PostalCode 
FROM #Client

drop table #Client

答案 4 :(得分:0)

另一个解决方案是使用ISNULL

Select FirstName, LastName
    , ISNULL(StreetAddress+', ','')
      +ISNULL(City+', ','')
      +ISNULL(Country+', ','')
      +ISNULL(PostalCode,'')
FROM Client

如果值为null,则连接结果将为null。 ISNULL将用第二个表达式替换第一个表达式。

http://msdn.microsoft.com/en-us/library/ms184325(v=SQL.90).aspx

答案 5 :(得分:0)

这是一个古老的问题,SQL 2012添加了CONCAT函数,使这种事情变得容易一些。试试这个:

<h1>Holiday Tour</h1>
<form role="form" action="" method="post" class="f1">
<label><input onclick="increasePrice(this)" type="checkbox" value="500" > Chennai Trip (Rs.500/-)</label>
<label><input onclick="updateFullPayment(this)" class="price-input" type="radio"  name="optradio" value="4700">
                                                          1 PERSON - <b>Cost Rs.<span class="price">4700</span>/- </b>
                                                          </label>
</form>
<p>how to display above checked amount to the below field</p>
<p><label><input type="radio" name="optradio" id="full-price-radio">
                                                          Full Payment    <b>Cost Rs<span id="full-price"></span>/-</b>
                                                          </label></p>
<p><label><input type="radio" name="optradio">
                                                          Advance Payment    <b>Cost Rs  /-</b>
                                                          </label></p>
<p>Tour Package : </p>

CONCAT将自动将NULL视为空字符串,因此您不需要使用ISNULL或COALESCE。 STUFF函数可以删除第一个逗号,如Thomas的回答