【发布时间】:2020-10-29 21:08:32
【问题描述】:
我找到了识别具有重复值的列的方法,并且我可以使用 Select Distinct 来查找只有一个值的列,但是我有很多包含数百列甚至数百万行的表。我需要找到该列仅包含 0、0.00、Z、N 或 Y 的每个列名。本质上是试图创建一个无用列的列表。
如何在每一列、一次一列中迭代 select distinct(或沿着这些线的东西),并在表中识别每行中的列值都相同的那些实例?或者,行数小于 2 的实例。
这似乎有点接近,但指定值无济于事: SQL Server SELECT where any column contains 'x'
分组并拥有 > 1 种作品,但我必须为每一列运行它。
Select Distinct 有效,但我必须一次运行一列,除非我缺少更好的方法。
我有一些方法可以合作,但仅限于数字列:Find columns that contain only zeros
这可以识别仅包含 NULL 的列,但我似乎无法让它对任何其他值起作用:
DECLARE crs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM syscolumns WHERE id=OBJECT_ID('TABLENAME')
OPEN crs
DECLARE @name sysname
FETCH NEXT FROM crs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('SELECT ''' + @name + ''' WHERE NOT EXISTS (SELECT * FROM TABLENAME WHERE ' + @name + ' IS NOT NULL)')
FETCH NEXT FROM crs INTO @name
END
CLOSE crs
DEALLOCATE crs
我已经开始适应了一点,但在 from:
附近遇到了关于不正确语法的错误DECLARE crs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM syscolumns WHERE id=OBJECT_ID('TABLENAME')
DECLARE @sql NVARCHAR(MAX)
OPEN crs
DECLARE @name sysname
FETCH NEXT FROM crs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
Create Table #Temp (ID NVARCHAR, Info INT)
SET @sql = N'select distinct ''' + @name + ''' insert into #Temp (ID) from TABLENAME; SELECT COUNT(*) from #Temp Having COUNT(*)<2 insert into #Temp (Info);'
EXEC sp_executesql @sql
DROP TABLE #Temp
FETCH NEXT FROM crs INTO @name
END
CLOSE crs
DEALLOCATE crs
【问题讨论】:
-
实现这一目标的唯一方法是使用动态 SQL。然而,这似乎是一个奇怪的要求。为什么你需要找出这个?你打算如何处理这些信息?这听起来像是开始,或结束,或XY Problem。
-
我需要减少列数,以便我们可以更好地将这个旧数据库与新数据库对齐。因此,所有这些只有零或 0.00 的列都没有提供任何信息,并且使得筛选旧数据和将旧数据与新数据对齐变得更加困难。在具有 10 或 20 列的较小表上很容易,但在有 200 列且只有 20 列有有用信息的情况下,排序太多了。
标签: sql-server