【问题标题】:boolean row of specific values in columns in table表中列中特定值的布尔行
【发布时间】:2017-01-11 14:17:17
【问题描述】:

我正在尝试如何查找列中是否存在另一个值为 '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 

它工作正常,但似乎很复杂。任何人都可以建议 还有什么?

【问题讨论】:

  • 这几乎是最简单的方法,并且在性能上会非常好。还有其他方法,但没有一种方法会过于“更好”。不过,您的查询一点也不复杂。

标签: sql-server sql-server-2005


【解决方案1】:

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

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)

结果:

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

【讨论】:

    【解决方案2】:

    我会做你所做的,但还有其他选择......

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2012-04-08
      • 2020-11-11
      • 2015-01-21
      • 2019-02-20
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多