SQL省略具有所有相同值的列

时间:2013-11-25 19:18:12

标签: 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

3 个答案:

答案 0 :(得分:1)

虽然可以使用SQL来查找列中的所有行是否具有相同的值,但是无法使固定的SQL语句根据查询的内容返回列。

以下是如何确定列中的所有项目是否具有相同的值:

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

您可以运行初步查询以查看是否需要显示列,然后动态形成查询,包括仅在您需要时使用该列。

答案 1 :(得分:0)

更改 columns 的唯一方法是执行单独的查询。所以你必须做类似的事情:

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

然而,基于数据返回不同的列通常一般不良做法 - 否则,在尝试之前,先让客户端确定特定列是否在结果集中访问数据。

显示数据时,通常会执行此类要求,例如在网页,报告等中

答案 2 :(得分: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;