空字段不应显示在单独的列中

时间:2013-01-02 11:47:24

标签: sql sql-server sql-server-2008

这是我的SQL查询

select C.Name, C.[Name 2] ,
    C.Address, C.[Address 2],C.[Address 3], 
    C.City, C.[Post Code], C.[Contact], CR.Name as country, 
    SIH.[ARE Gr_Wt],SIH.[Total Boxes] , SIH.[Posting Date] , 
    SIH.[Country of Origin of Goods],
    CASE when C.[E-Mail] <> '' then  'E-mail: ' + C.[E-Mail] else '' end [E-Mail] 
from [Sales Invoice Header] SIH 
inner join [Customer] C 
    on C.No_ = SIH.[Sell-to Customer No_]
inner join [Country_Region] CR 
    On CR.Code = SIH.[Country of Final Destination] 
where SIH.No_ = 'PEXP1213-596'

在此查询中,如果我的地址3字段没有所有客户的值..我只有在有值时才需要显示此地址3列...我不想显示空列

1 个答案:

答案 0 :(得分:3)

根据您的说明和评论,听起来您只想在其中包含值时显示Address 3列。

如果没有值,则无法显示所有客户,但隐藏列,至少在一个查询中,您无法执行此操作。

如果您SELECT所有字段都要获得Address 3字段,除非您专门将其过滤掉,但如果您过滤,则无法获得所有数据。

例如,如果您有以下示例数据:

CREATE TABLE yourtable
    ([id] int, [name] varchar(4), [Address1] varchar(10), [Address2] varchar(4));

INSERT INTO yourtable ([id], [name], [Address1], [Address2])
VALUES
    (1, 'Test', '12345 blah', NULL),
    (2, 'John', '45 Test', 'test');

如果我使用查询(请参阅SQL Fiddle with Demo):

select id,
  name, 
  address1,
  address2
from yourtable

它将返回表格中的所有数据,包括Address2字段中没有值的记录。

如果我不想显示空Address2的记录,我将丢失不是您想要的记录。 (见SQL Fiddle with Demo):

select id,
  name, 
  address1,
  address2
from yourtable
where address2 is not null 
  or address2 <> ''

无法隐藏选择列表中的列。您只能通过不选择值来隐藏它。

所以你可以执行两个选择,但这些选择不在同一个数据集中。您可以使用以下内容:

select id,
  name, 
  address1,
  address2
from yourtable
where Address3 is not null 
  or Address3 <> '';

然后第二个查询选择空Address3的记录:

select id,
  name,
  address1
from yourtable
where Address3 is null 
  or Address3 = '';

我建议这样做的另一种方法是使用CASE语句构建一个类似于此的地址字符串:

select C.Name, 
  C.[Name 2] ,
  case 
    when C.[Address 3] is not null or C.[Address 3] <> ''
    then C.Address +' '+ C.[Address 2] + ' '+ C.[Address 3]
    else C.Address +' '+ C.[Address 2] end Address, 
  C.City, 
  C.[Post Code], 
  C.[Contact], 
  CR.Name as country, 
  SIH.[ARE Gr_Wt],
  SIH.[Total Boxes], 
  SIH.[Posting Date], 
  SIH.[Country of Origin of Goods],
  CASE when C.[E-Mail] <> '' then  'E-mail: ' + C.[E-Mail] else '' end [E-Mail] 
from [Sales Invoice Header] SIH 
inner join [Customer] C 
  on C.No_ = SIH.[Sell-to Customer No_]
inner join [Country_Region] CR 
  on CR.Code = SIH.[Country of Final Destination] 
where SIH.No_ = 'PEXP1213-596'

这将检查Address 3中是否有值,如果有,则将所有地址列连接成一个字符串。如果Address 3中没有值,则它只会连接Address 1Address 2