2015-11-05 19 views
1

我不確定是否有可能,但感激是否有人可以幫助我做到這一點。如果整列中的空白值然後從輸出中刪除

如果所有輸出行的列爲空,則不應出現在輸出中。

樣本數據:

DECLARE @T TABLE 
(

BaseVehicle VARCHAR (50), 
SubModel VARCHAR (50), 
Make VARCHAR (50), 
Years VARCHAR (50), 
FromYear VARCHAR (50), 
ToYear VARCHAR (50) 
) 


INSERT @T 

SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL  
SELECT '1979 Ford LTD','','FORD','1979','','2005' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' 

期望輸出

BaseVehicle |Make|year|toyear 
1979 Ford LTD |ford|1979| 
1979 Ford LTD |ford|1979|2005 
1979 Ford LTD |ford|1979| 
1979 Ford LTD |ford|1979| 

感謝

+1

它沒有出現您的查詢正在工作 – wiretext

+0

我建議隱藏代碼背後的列而不是。 – User2012384

+0

你是說我的示例數據不起作用嗎? – Shan

回答

1

檢查所有計數爲空的單元的數量。如果兩者都匹配,那麼整個列都是null。然後從選擇中離開該列。

查詢

create table #T 
(
    BaseVehicle VARCHAR (50), 
    SubModel VARCHAR (50), 
    Make VARCHAR (50), 
    Years VARCHAR (50), 
    FromYear VARCHAR (50), 
    ToYear VARCHAR (50) 
) 

INSERT into #T 
SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL  
SELECT '1979 Ford LTD','','FORD','1979','','2005' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' 

declare @strsql varchar(2500) 
    set @strsql = 'select ' 
    set @strsql += 
    (select case when (select COUNT(*) from #T where BaseVehicle = '') 
    <> (select count(*) from #T) then 'BaseVehicle, ' else '' end) 
    set @strsql += 
    (select case when (select COUNT(*) from #T where SubModel = '') 
    <> (select count(*) from #T) then 'SubModel, ' else '' end) 
    set @strsql += 
    (select case when (select COUNT(*) from #T where Make = '') 
    <> (select count(*) from #T) then 'Make, ' else '' end) 
    set @strsql += 
    (select case when (select COUNT(*) from #T where Years = '') 
    <> (select count(*) from #T) then 'Years, ' else '' end) 
    set @strsql += 
    (select case when (select COUNT(*) from #T where FromYear = '') 
    <> (select count(*) from #T) then 'FromYear, ' else '' end) 
    set @strsql += 
    (select case when (select COUNT(*) from #T where ToYear = '') 
    <> (select count(*) from #T) then 'ToYear, ' else '' end) 
    set @strsql = LEFT(@strsql,len(@strsql) -1) 
    set @strsql += ' from #T' 

    exec (@strsql) 

結果

BaseVehicle  Make Years ToYear 
1979 Ford LTD FORD 1979  
1979 Ford LTD FORD 1979 2005 
1979 Ford LTD FORD 1979  
1979 Ford LTD FORD 1979  

甚至可以使動態查詢如果表中有INFORMATION_SCHEMA

+0

謝謝Ullas .....:) – Shan

+0

@Shan,這是Ulas的答案的改進版本:http://sqlfiddle.com/#!6/9eecb7/4266/0 –

+0

謝謝所有............... .. – Shan

1

其實你可以用臨時表做到這一點,因爲你可以改變它。但我不建議這樣做:

DECLARE @T TABLE(
BaseVehicle VARCHAR (50), 
SubModel VARCHAR (50), 
Make VARCHAR (50), 
Years VARCHAR (50), 
FromYear VARCHAR (50), 
ToYear VARCHAR (50)) 

INSERT @T 
SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL  
SELECT '1979 Ford LTD','','FORD','1979','','2005' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' UNION ALL   
SELECT '1979 Ford LTD','','FORD','1979','','' 

SELECT * INTO #staging FROM @T 

IF(NOT EXISTS(SELECT * FROM #staging WHERE BaseVehicle <> '')) 
    ALTER TABLE #staging DROP COLUMN BaseVehicle 

IF(NOT EXISTS(SELECT * FROM #staging WHERE SubModel <> '')) 
    ALTER TABLE #staging DROP COLUMN SubModel 

IF(NOT EXISTS(SELECT * FROM #staging WHERE Make <> '')) 
    ALTER TABLE #staging DROP COLUMN Make 

IF(NOT EXISTS(SELECT * FROM #staging WHERE Years <> '')) 
    ALTER TABLE #staging DROP COLUMN Years 

IF(NOT EXISTS(SELECT * FROM #staging WHERE FromYear <> '')) 
    ALTER TABLE #staging DROP COLUMN FromYear 

IF(NOT EXISTS(SELECT * FROM #staging WHERE ToYear <> '')) 
    ALTER TABLE #staging DROP COLUMN ToYear 

SELECT * FROM #staging 
DROP TABLE #staging 

輸出:

BaseVehicle  Make Years ToYear 
1979 Ford LTD FORD 1979  
1979 Ford LTD FORD 1979 2005 
1979 Ford LTD FORD 1979  
1979 Ford LTD FORD 1979  
1

列在任何給定的SQL查詢的數量是靜態的。沒有語法來動態添加或刪除SQL查詢中的列。

你可以把一些做兩個查詢的東西拼湊在一起:首先確定一個或多個行是否有值,然後是第二次執行兩個不同SELECT中的一個,一個包含列表中的額外列,另一個不包含。

喜歡的東西:

IF EXISTS(SELECT * FROM @T WHERE Submodel <> '') 
    SELECT BaseVehicle, Submodel, Make, Year, FromYears, ToYear FROM @T 
ELSE 
    SELECT BaseVehicle, Make, Year, FromYears, ToYear FROM @T; 

正如你可能已經猜到,這是越來越漂亮哈克,而不是一個通用的解決方案。所以如果你需要這個多列和/或表,它會變得非常難以管理。

這實際上聽起來像是更適合應用層的東西。無論運行哪個代碼查詢並處理結果都更適合顯示和隱藏列。