【问题标题】:A SQL query that replaces null values.替换空值的 SQL 查询。
【发布时间】:2008-10-15 22:18:17
【问题描述】:

我需要一个从下表返回 ContactDate、SortName、City、ContactType 和 Summary 的 SQL 查询。如果任何值为 null,我需要它返回文本“No Entry”。

联系表

  • 联系人 ID
  • 联系日期
  • 用户ID
  • 总结
  • 联系人类型
  • 排序名称

用户表

  • 用户 ID
  • 名字
  • 姓氏
  • 地址ID

地址表

  • 地址 ID
  • 城市
  • 街道
  • 状态
  • 邮编

【问题讨论】:

  • MS SQL 2000 最终走向水晶报表 8.0

标签: sql null


【解决方案1】:
SELECT COALESCE(CAST(CONVERT(VARCHAR(10), ContactTable.ContactDate, 101) AS VARCHAR(10)), 'No Entry') AS ContactDate,
       COALESCE(ContactTable.SortName, 'No Entry') AS SortName,
       COALESCE(AddressTable.City, 'No Entry') AS City,
       COALESCE(ContactTable.ContactType, 'No Entry') AS ContactType
FROM ContactTable
LEFT OUTER JOIN UserTable ON ContactTable.UserID = UserTable.UserID
LEFT OUTER JOIN AddressTable ON UserTable.AddressID = AddressTable.AddressID

Here 是上面 CONVERT 语句的 SQL 日期时间格式图表。

【讨论】:

  • 这会在日期抛出异常。
【解决方案2】:

COALESCE() 在任何值得盐分的平台上。

确保处理投射问题。

如:

--(SQL Server)
SELECT
  C.ContactID,
  COALESCE(CAST(CONVERT(varchar(10), C.ContactDate, 101) AS varchar(10), 'No Entry') AS ContactDate,
  COALESCE(SorName, 'No Entry') AS SortName

等等等等

【讨论】:

  • 这是迄今为止唯一考虑到您需要将非 varchar 列转换回 varchar 以与 coalesce/isnull 一起使用的事实的答案。
  • 您在第二个 varchar(10) 之后缺少一个右括号。我们都因为马虎而输了! ;-)
  • 是的,这就是我在答案框中输入的结果:)
【解决方案3】:
SELECT 
  ISNULL(ContactDate, 'No Entry') AS ContactDate
FROM Table

使用 ISNULL 非常简单。

【讨论】:

  • 如果 ContactDate 为空,此代码将被炸毁。 “从字符串转换日期时间时转换失败。”您需要转换为 varchar。
【解决方案4】:

此函数的 Oracle 版本称为 nvl。用法相同——SELECT nvl(col_name, desired_value) FROM foo

更通用的版本是decode,它具有三个参数,允许您指定要执行替换的列值(因此您可以将所有“Johnny”替换为“John”或其他内容)。

【讨论】:

    【解决方案5】:

    使用“IIF”是一种 Access DB 解决方案,但可能适用于其他 DB。

    SELECT IIF(IsNull(Foo), 'No Entry' ,Foo), IIF(IsNull(Bar), 'No Entry' ,Bar) From TableName   
    

    函数 IIF 返回 2 个值之一,具体取决于表达式的评估。
    SQL 语法: IIF(表达式,真值1,假值)

    【讨论】:

      【解决方案6】:

      您还可以对每列进行不同的调用。这将需要更多的单独调用,但如果您没有太多要更新的行,它可能会更快。

      更新联系人表 设置 ContactDate = '无条目' 其中 ContactDate 为空;

      对每一列重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2012-06-18
        • 2020-05-08
        • 1970-01-01
        • 2010-12-27
        • 2021-12-26
        • 1970-01-01
        相关资源
        最近更新 更多