2013-11-25 70 views
0

有沒有辦法編寫SQL查詢來忽略具有所有相同值的列?例如,SQL忽略所有相同值的列

row A B 
1  9 0 
2  7 0 
3  5 0 
4  2 0 

我想只返回

row A 
1  9  
2  7  
3  5  
4  2 
+0

典型的一個例子液_columns_查詢返回的是不變的 - 否則如何在客戶端要知道,如果一列存在與否? –

+0

哪個是RDBMS? – Szymon

+0

您可以編寫一個動態SQL來實現這一目標,但您試圖實現的目標是什麼? – Szymon

回答

1

雖然可以使用SQL找到,如果在一列中的所有行具有相同的價值觀,有沒有辦法使固定的SQL語句不返回基於查詢內容的列。

這裏是如何找出如果一列中的所有項具有相同的值:

SELECT COUNT(row)=COUNT(DISTINCT B) FROM my_table 

您可以運行一個初步查詢,看是否有列需要顯示出來,然後動態地形成查詢,包括專欄只在需要時才提供。

0

要更改的唯一方法是執行單獨的查詢。所以,你必須做一些事情,如:

IF EXISTS(SELECT null FROM myTable WHERE B <> 0) 
BEGIN 
    SELECT row, A, B FROM myTable 
END 
ELSE 
BEGIN 
    SELECT row, A FROM myTable 
END 

然而,它的一般不好的做法,返回基於數據的不同列 - 否則,你讓客戶確定某一特定列是在結果集首先嚐試訪問數據。

這種要求通常在顯示數據(例如,在網頁中,在報告中等。

0

無法編寫只返回具有不同值的列的查詢語句。但是,您可以使用一些條件語句根據您的需要執行不同的查詢。

您也可以將查詢結果插入臨時表中,循環遍歷列,構建一個新的select語句,該語句只包含具有不同值的列並最終執行語句。

注意:您應該只包含位列來指示列是否全部重複。然後應用程序可以放棄任何已被指定爲所有重複項的列。

總之,這裏的SQL Server的

-- insert results into a temp table 
SELECT * 
INTO #data 
FROM (
    SELECT 1 AS col1, 1 AS col2, 2 AS col3 
    UNION ALL 
    SELECT 2, 1, 3 
) d; 

DECLARE 
    @column sysname, 
    @sql nvarchar(max) = '', 
    @finalSql nvarchar(500) = 'SELECT ', 
    @allDuplicates bit; 

DECLARE colsCur CURSOR 
FOR 
SELECT name 
FROM tempdb.sys.columns 
WHERE object_id = OBJECT_ID('tempdb..#data'); 

OPEN colsCur; 

FETCH NEXT FROM colsCur INTO @column; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'SELECT @allDuplicates = CASE COUNT(DISTINCT ' + @column + ') WHEN 1 THEN 1 ELSE 0 END FROM #data'; 

    EXEC sp_executesql @sql, N'@allDuplicates int OUT', @allDuplicates = @allDuplicates OUT; 

    IF @allDuplicates = 0 SET @finalSql = @finalSql + @column + ','; 

    FETCH NEXT FROM colsCur INTO @column; 
END 

CLOSE colsCur; 
DEALLOCATE colsCur; 

SET @finalSql = LEFT(@finalSql, LEN(@finalSql) - 1) + ' FROM #data'; 

EXEC sp_executesql @finalSql; 

DROP TABLE #data;