在MYSQL Jointure中将所有NULL值替换为空

时间:2014-11-15 07:23:33

标签: mysql sql null

我正在开发一个归档模块。为此,我使用SELECT查询,其中包含许多LEFT JOINTURE来组合来自许多表的数据。然后将这些数据插入一个存档表中。根据数据,我可能有值为NULL的字段。因为我想避免该表中的NULL值(我多次读过这会影响性能),我想在SELECT查询的结果中系统地更改空字符串中的NULL。

我发现COALESCE可以完成这项工作,但据我所知,这只能应用于一个领域。它必须重复到每个领域。但是我有超过50个字段,我最终会得到一个无休止的查询..有没有办法在SELECT查询中用空字符串系统地替换NULL值?

谢谢!

3 个答案:

答案 0 :(得分:1)

这不是一个好主意。不要用空字符串替换NULL。

NULL值具有以下含义:此字段未设置,未填写。空值表示已填充且故意为空。

See this answer

答案 1 :(得分:0)

就个人而言,我将值保留为NULL,因为我认为对于存档表格的应用程序来说,能够区分NULL和空白值以及它们的表示层确定如何更好显示NULL。

如果我有一个非常令人信服的理由来转换它们,我只需编写50个COALESCE函数并完成它。你可以在几乎相同的时间内完成它,就像在这里提出问题一样。

某些数据库允许您使用在表级别定义的触发器或默认值来处理此类转换,但如果您使用触发器执行NULL转换,则会更加努力并且可能会引入性能问题。

答案 2 :(得分:0)

这可能有助于生成SQL

SELECT 
concat(
  'coalesce(', COLUMN_NAME, ',',    
    CASE 
        WHEN DATA_TYPE in ('bigint', 'int', 'tinyint', 'decimal', 'double', 'float', 'smallint') 
                                     THEN 0
        WHEN DATA_TYPE = 'date'      THEN 'STR_TO_DATE("1900-01-01", "%Y-%m-%d")'
        WHEN DATA_TYPE in('timestamp', 'datetime')  
                                     THEN 'STR_TO_DATE("1900-01-01 12:00:00", "%Y-%m-%d %h:%i:%s")'
        ELSE '''''' -- everything else get's an empty string
    END,
    ') as ', COLUMN_NAME
) as generated_sql
  
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_name'