【问题标题】:Replace NULL with blank value (SQL Server)将 NULL 替换为空白值 (SQL Server)
【发布时间】:2019-05-13 17:18:23
【问题描述】:

用空白值替换NULL值

在尝试使用 CASE 语句将 NULL 转换为空白值时。

注意:sampCol 是数字 ID

,CASE WHEN sampCol IS NULL THEN '' ELSE sampCol END as sampCol

我不断收到以下错误:

将数据类型 varchar 转换为数值时出错。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您正在混合数字和字符串值。

    NULL 不是空字符串。就是没有价值。

    像这样的项目确实应该降级到表示层,但如果必须,请尝试以下作弊。

    ...
    , concat('',sampCol) as sampCol 
    ...
    

    【讨论】:

    • 这会在 WHERE 语句下吗?
    • @PhilK 不。这是专栏。我不知道你的 WHERE 语句是什么
    • “真的应该降级到表现层”
    • 对不起,我的意思是 WHERE 子句,但是是的,我明白了你的意思。但是,是的,这完全有效。谢谢
    • 虽然这确实有效,但这确实意味着 10 WHERE@PhilK 中。它会破坏您的查询的任何性能。
    【解决方案2】:

    添加到肖恩梅的答案。三个左括号和只有 2 个右括号永远不会起作用。 试试:

    ISNULL(CAST(sampCol AS VARCHAR(100)),'')
    

    也许使用AS 添加字段名称,以便您可以在您的应用程序中使用它。

    ISNULL(CAST(sampCol AS VARCHAR(100)),'') as samplColName
    

    【讨论】:

      【解决方案3】:

      这是因为 case 表达式可以根据数据类型优先级返回一个且唯一的数据类型。您不能将空字符串转换为数字数据类型。您尝试做的事情听起来像是属于表示层,而不是数据层。让NULL发生!!!

      【讨论】:

      • 那么就没有办法了吗?
      • 总有办法的。但在这种情况下,你不应该。您的表示逻辑不属于数据库。
      【解决方案4】:

      COALESCE()CAST() 结合使用会有所帮助:

      SELECT COALESCE(CAST(SampCol AS VARCHAR (10)), '') AS SampCol
      FROM TestTable
      

      这里不是VARCHAR (10),您可以根据您的业务需要更改所需的长度。

      Demo on db<>fiddle

      【讨论】:

        【解决方案5】:

        将所有空值修复到数据库中的脚本

        /布莱恩·阿尔瓦雷斯·阿亚拉/ 电子邮件 - brian.alvarez@yahoo.com 网站 - w w w 。 a s e s o r i a r e m o t a 。哥们

        声明@COLUMN_NAME varchar(40) 声明@DATA_TYPE varchar(40) 声明@TABLES_NAMES varchar(40) 声明@TABLE_SCHEMA varchar(40) 声明@IS_NULLABLE varchar(3)

        声明@SqlCMD varchar(MAX) 声明 tablas 光标 从 INFORMATION_SCHEMA.TABLES 中选择 t.TABLE_SCHEMA ,t.TABLE_NAME,c.COLUMN_NAME,c.DATA_TYPE,c.IS_NULLABLE t 内部连接 ​​INFORMATION_SCHEMA.COLUMNS c 在 c.TABLE_NAME = t.TABLE_NAME 和 c.TABLE_SCHEMA = t.TABLE_SCHEMA 打开表 从 tablas 获取下一个到 @TABLE_SCHEMA,@TABLES_NAMES,@COLUMN_NAME,@DATA_TYPE,@IS_NULLABLE 而@@FETCH_STATUS =0 开始
        if (@DATA_TYPE = 'numeric' 或 @DATA_TYPE = 'int') 和 @IS_NULLABLE='YES' 开始 set @SqlCMD ='Update ' + @TABLE_SCHEMA+'.'+@TABLES_NAMES + ' set ' + @COLUMN_NAME +' = 0 其中 ' + @COLUMN_NAME + ' 为空' 打印@sqlcmd 结束

            if (@DATA_TYPE = 'nvarchar' or @DATA_TYPE = 'varchar' or @DATA_TYPE = 'char') and @IS_NULLABLE='YES'
            begin
                set @SqlCMD ='Update ' + @TABLE_SCHEMA+'.'+@TABLES_NAMES + ' set ' + @COLUMN_NAME + ' = ' + ''' ''' + ' where ' + @COLUMN_NAME + ' is null'
                print @sqlcmd
            end
        
            if (@DATA_TYPE = 'bit') and @IS_NULLABLE='YES'
            begin
                set @SqlCMD ='Update ' + @TABLE_SCHEMA+'.'+@TABLES_NAMES + ' set ' + @COLUMN_NAME + ' = ' + '''False''' + ' where ' + @COLUMN_NAME + ' is null'
                print @sqlcmd
            end
        
            fetch next from tablas into @TABLE_SCHEMA,@TABLES_NAMES,@COLUMN_NAME,@DATA_TYPE,@IS_NULLABLE
        end 
        

        关闭表格 解除分配表

        【讨论】:

        • 请修正您答案的格式。此外,更多的描述将有助于任何读者更好地理解您的代码。
        【解决方案6】:
            ..CASE WHEN sampCol IS NULL THEN to_number('') ELSE sampCol END as sampCol
        

        【讨论】:

        • to_number('') 不是可识别的内置函数名称。
        • 啊 SQL Server。 ..CASE WHEN sampCol 为 NULL THEN cast('' as number) ELSE sampCol END as sampCol
        • 有些函数可以处理这种情况。不需要CASE。对于 T-SQL,请使用 ISNULL(CAST(sampCol AS VARCHAR(100),'') 或通用 SQL COALESCE(CAST(sampCol AS VARCHAR(100),'')
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        相关资源
        最近更新 更多