【问题标题】:Why can't you use COUNT() method on text?为什么不能对文本使用 COUNT() 方法?
【发布时间】:2015-01-19 12:07:41
【问题描述】:

虽然herehere 已经介绍了解决此问题的方法,但为什么实际上不能对文本数据类型使用 COUNT()?是技术限制吗?有谁知道这是什么内部机制?

【问题讨论】:

  • 为什么没有意义?作为非 MS SQL Server 用户,我不明白为什么?聚合函数 COUNT 应该适用于所有数据类型。如果列值不为空,则计入,如果为空,则不计入。
  • 有很多你不能在文本上做的事情,你可以在例如varchars上做。这也是不推荐使用数据类型的原因。如果必须使用文本,您应该按照@a_horse_with_no_name 的建议进行操作。但具体的实现限制我不知道。
  • 是的,正如 jarlh 所说,我们知道解决方案。但是,为什么不能指望任何数据类型?
  • 不知道原因。假设它是历史性的。即使没有强制转换,使用COUNT(CASE WHEN YourTextCol IS NOT NULL THEN 1 END) 也是微不足道的,尽管因此怀疑它是否存在任何技术限制。可能只是一些从未实施过的东西,也永远不会被弃用。
  • 一个不同的内部机制是文本的内部存储总是“行外”。替换 nvarchar(max) 可以“按行”存储部分数据(8000 字节),并且不必执行任何 LOB 读取来确定该值是否为空。是这个原因吗?不,我不这么认为。原因可能是因为该数据类型已被弃用,并且由于在 SQL Server 2000 或类似的东西中添加了替代品,因此没有对其进行更多开发。

标签: sql sql-server


【解决方案1】:

回答您的实际问题:

旧的大格式/LOB 数据类型:TEXT、NTEXT 和 IMAGE,是过时的/过时的数据类型,具有许多技术限制(例如,您不能直接在其中使用 UPDATE)。

Microsoft 在 SQL Server 2005 版本中修复了此问题,但为了保持与先前版本的兼容性,使用了三种 数据类型:VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX )。您应该改用这些数据类型,它们几乎在所有方面都更好。

【讨论】:

    【解决方案2】:

    我猜您已经找到了解决方案,但是对于正在寻找答案的其他人来说,这将是可行的。 case 语句为找到非 Null 或空字符串的每一行返回 1,为每一行为空或 Null 返回 0。它适用于字符和数字字段。外部的 Sum() 函数有效地返回计数:

    select sum(
         case when YourField >'' then 1
         else 0
         end
    ) 'mycount'
    from YourTable
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2012-02-17
      • 2017-04-11
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      相关资源
      最近更新 更多