有没有办法编写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 :(得分: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;