时间:2017-01-11 14:17:18

标签: sql-server sql-server-2005

我正在尝试如何查找列中是否存在其他值为“0”的情况 MSSQL server 2005表有40列,730行和数字数据。

表格中的数据示例:

date|col1 |col2 |col3 | col4| 
1   | 0   | 0   | 0   |  0  |      
2   | 45  | 0   | 7   |  0  |     
3   | 0   | 0   | 0   |  0  |     
4   | 75  | 0   | 0   |  0  | 
5   | 0   | 0   | 0   |  0  |
6   | 7   | 0   | 0   |  0  | 
7   | 0   | 0   | 7   |  0  | 
8   | 0   | 0   | 7   |  0  |
9   | 0   | 0   | 7   |  0  |

结果我需要的是一行布尔值,
其中0表示列中的所有记录都是值为“0”的记录 并且1表示列中至少存在除“0”以外的其他值的一倍 结果可以存储在临时表中。

我需要这样的东西:

| col1 | col2 | col3 | col4 |  
|  1   |  0   |  1   |  0   |

我该怎么办?有人可以帮忙吗?

我尝试了这个查询:

SELECT  
    CASE   
        WHEN max(col1) = 0 
        THEN 0 
        ELSE 1  
    END as col1,  
    CASE  
        WHEN max(col2) = 0 
        THEN 0 
        ELSE 1  
    END as col2,   
    CASE  
        WHEN max(col3) = 0  
        THEN 0  
        ELSE 1  
    END as col3,     
        CASE  
        WHEN max(col4) = 0  
        THEN 0  
        ELSE 1  
    END as col4        
FROM table 

它工作正常,但似乎非常复杂。任何人都可以建议 别的什么?

2 个答案:

答案 0 :(得分:0)

如果您不想列出所有40列,可以使用动态SQL:

git checkout

结果:

DECLARE @SQL varchar(8000)

SET @SQL = 'SELECT '

SELECT @SQL = @SQL + 'CASE WHEN MAX('+ COLUMN_NAME +') = 0 THEN 0 ELSE 1 END As '+ COLUMN_NAME +','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T'

SET @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ' FROM T'

EXEC(@SQL)

答案 1 :(得分:0)

我做你做过的事,但也有其他选择......

ISNULL(MAX(NULLIF(col1, 0)), 0)

那个依赖于没有NULL值(或者NULL可以被视为0。

这是我能想到的最短的健壮版本......

MAX(CASE Col1 WHEN 0 THEN 0 ELSE 1 END)