2013-11-25 68 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;