0

这是我的 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 列只有当它有值时...我不想显示空列

4

1 回答 1

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

于 2013-01-02T12:05:06.543 回答