【发布时间】:2011-10-28 14:45:18
【问题描述】:
我有一张大表,里面有一些 NULL。从表中选择 0 而不是 NULL 的最简单方法是什么。
或者如果没有简单的方法可以做到这一点,我愿意用 0 物理替换表中的所有空值。
有很多列,我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西逐一遍历。
【问题讨论】:
标签: sql sql-server sql-server-2005
我有一张大表,里面有一些 NULL。从表中选择 0 而不是 NULL 的最简单方法是什么。
或者如果没有简单的方法可以做到这一点,我愿意用 0 物理替换表中的所有空值。
有很多列,我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西逐一遍历。
【问题讨论】:
标签: sql sql-server sql-server-2005
正如这里的许多人所说,最好的方法是 ISNULL(),但是如果您想要一种简单的方法来生成所有这些 ISNULL(),请使用以下代码:
SELECT 'ISNULL([' + COLUMN_NAME + '], ' +
CASE
WHEN DATA_TYPE = 'bit' THEN '0'
WHEN DATA_TYPE = 'int' THEN '0'
WHEN DATA_TYPE = 'decimal' THEN '0'
WHEN DATA_TYPE = 'date' THEN '''1/1/1900'''
WHEN DATA_TYPE = 'datetime' THEN '''1/1/1900'''
WHEN DATA_TYPE = 'uniqueidentifier' THEN '00000000-0000-0000-0000-000000000000'
ELSE '''''' -- everything else get's an empty string
END + ') AS [' + COLUMN_NAME + '],'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName'
这将使繁琐的工作变得容易得多,然后您只需编辑输出以考虑各种字段类型(int、varchar、日期等)
编辑:使用默认值考虑各种数据类型..
【讨论】:
0 不是所有列类型的有效替换值
你真的有两个选择
ISNULL(yourColumn,0) AS columnName
或实际解决问题并将所有 NULL 数据更改为 0
UPDATE table
SET column = 0
WHERE
column IS NULL -- remember "column = NULL" always equates to NULL!
当你这样做时,不要忘记 WHERE,否则一切都会变成 0!
【讨论】:
您必须在 SELECT 语句中手动指定每一列并使用 ISNULL() 函数:
SELECT ISNULL(columnName, 0), ... yes all of them
【讨论】:
NOT NULL DEFAULT 0。
尽管你不愿意这样做,
ISNULL(FieldName,0) AS FieldName
对于每一列都是正确的处理方法。
【讨论】:
当老板。像这样写:
select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null'
from tempdb.information_schema.columns
where table_name = 'YourTableName'
它会为你吐出一个很大的查询。
【讨论】:
除了ISNULL,您还可以使用COALESCE,它与ANSI SQL 兼容。
select coalesce(yourcolumn, 0)
有很多列,我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西逐一遍历。
你不能总是得到你想要的。太糟糕了。这是要走的路:逐列。
【讨论】:
如您所说,不浏览每一列并不容易。
NULL 对 0 具有特殊而独特的含义。它表示没有值或未知,而不是已知的零值。一些数据库纯粹主义者会争辩说,表中的一行根本不应该有 NULL!
如果源表中的 NULL 确实意味着零,则更改它们,否则在它们通过查询传播时处理它们。
【讨论】:
我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西遍历每一个。
每个人都这样做一次:
ALTER TABLE TableName ALTER COLUMN FieldName INTEGER DEFAULT 0 NOT NULL;
然后你就可以忘记ISNULL、COALESCE、三值逻辑等。
【讨论】:
我想要一个动态查询来执行更新选项。借用上面的帖子和another我有以下内容:
USE [YOUR DATABASE]
DECLARE @tableName nvarchar(100)
DECLARE @name varchar(50)
DECLARE @dtype varchar(50)
DECLARE @CMD NVARCHAR (200)
SET @tableName = [YOUR TABLE NAME]
DECLARE db_cursor CURSOR FOR
SELECT c.name, t.name AS Dtype
FROM sys.columns c
INNER JOIN sys.types t
ON t.system_type_id = c.system_type_id
WHERE c.[object_id] =
(SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [NAME] = @tableName)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name, @Dtype
WHILE @@FETCH_STATUS = 0 BEGIN
SET @CMD = 'UPDATE ' + @tableName + ' SET ' + quotename(@name) +' = ' +
(CASE
WHEN (@Dtype = 'bit') THEN '0'
WHEN (@Dtype = 'int') THEN '0'
WHEN (@Dtype = 'decimal') THEN '0'
WHEN (@Dtype = 'date') THEN '''1/1/1900'''
WHEN (@Dtype = 'datetime') THEN '''1/1/1900'''
WHEN (@Dtype = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000'
ELSE ''''''
END )
+ ' WHERE ' + quotename(@name) +' IS NULL'
PRINT @CMD
EXEC sp_executeSQL @cmd
FETCH NEXT FROM db_cursor INTO @name, @Dtype
END
CLOSE db_cursor
DEALLOCATE db_cursor
【讨论】: