有沒有辦法編寫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
有沒有辦法編寫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
雖然可以使用SQL找到,如果在一列中的所有行具有相同的價值觀,有沒有辦法使固定的SQL語句不返回基於查詢內容的列。
這裏是如何找出如果一列中的所有項具有相同的值:
SELECT COUNT(row)=COUNT(DISTINCT B) FROM my_table
您可以運行一個初步查詢,看是否有列需要顯示出來,然後動態地形成查詢,包括專欄只在需要時才提供。
要更改列的唯一方法是執行單獨的查詢。所以,你必須做一些事情,如:
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
然而,它的一般不好的做法,返回基於數據的不同列 - 否則,你讓客戶確定某一特定列是在結果集首先嚐試訪問數據。
這種要求通常在顯示數據(例如,在網頁中,在報告中等。
無法編寫只返回具有不同值的列的查詢語句。但是,您可以使用一些條件語句根據您的需要執行不同的查詢。
您也可以將查詢結果插入臨時表中,循環遍歷列,構建一個新的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;
典型的一個例子液_columns_查詢返回的是不變的 - 否則如何在客戶端要知道,如果一列存在與否? –
哪個是RDBMS? – Szymon
您可以編寫一個動態SQL來實現這一目標,但您試圖實現的目標是什麼? – Szymon