有没有办法编写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