【问题标题】:WHERE clause on SQL Server "Text" data typeSQL Server“文本”数据类型的 WHERE 子句
【发布时间】:2011-05-20 00:01:54
【问题描述】:

其中 [CastleType] 在 SQL Server 中设置为数据类型“文本”,查询为:

SELECT *
FROM   [Village]
WHERE  [CastleType] = 'foo' 

我得到错误:

数据类型 TEXTVARCHAR 在等于运算符中不兼容。

我不能用 WHERE 子句查询这种数据类型吗?

【问题讨论】:

  • 使用 VARCHAR(MAX) 而不是 TEXT - 该数据类型已被弃用

标签: sql-server sql-server-2005 tsql


【解决方案1】:

您不能使用= 运算符与text 进行比较,而必须使用here 列出的比较函数之一。另请注意页面顶部的大警告框,这很重要。

【讨论】:

    【解决方案2】:

    您可以使用LIKE 代替=。如果没有任何通配符,这将具有相同的效果。

    DECLARE @Village TABLE
            (CastleType TEXT)
    
    INSERT INTO @Village
    VALUES
      (
        'foo'
      )
    
    SELECT *
    FROM   @Village
    WHERE  [CastleType] LIKE 'foo' 
    

    text 已弃用。更改为varchar(max) 将更易于使用。

    还有数据可能有多大?如果您要进行相等比较,理想情况下您会希望对该列进行索引。如果您将列声明为大于 900 字节的任何内容,则这是不可能的,尽管您可以添加可用于加速此类查询的计算的 checksumhash 列。

    【讨论】:

      【解决方案3】:

      这不是错误消息所说的。它说您不能使用= 运算符。例如LIKE 'foo'

      【讨论】:

      • Col IN ('foo', 'bar')Col = 'foo' or Col = 'bar' 基本一样,会出现同样的问题。
      • @Martin:谢谢你的精彩,我不知道。到时候我会改正的。
      【解决方案4】:

      另一种选择是:

      SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
      

      【讨论】:

      • 我怀疑 like 'foo' 可能比这种方法提供更好的基数估计,但我不是 100% 肯定。
      • @Martin:由于您无法索引 TEXT 列,我认为无论哪种情况,您最终都会进行全表扫描。
      • 我同意,但它仍会使用列上的统计信息来估计将返回的行,这可能会影响连接决策等。
      【解决方案5】:

      这适用于 MSSQL 和 MySQL:

      SELECT *
      FROM   Village
      WHERE  CastleType LIKE '%foo%'; 
      

      【讨论】:

      • OP 使用的是 MSSQL 而不是 MySQL。
      【解决方案6】:

      如果您无法将表本身的数据类型更改为使用 varchar(max),则将您的查询更改为:

      SELECT *
      FROM   [Village]
      WHERE  CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'
      

      【讨论】:

        【解决方案7】:

        请试试这个

        SELECT *
        FROM   [Village]
        WHERE  CONVERT(VARCHAR, CastleType) = 'foo'
        

        【讨论】:

        • 如果您使用诸如 Toad for Sql Server 之类的工具保护 BLOB 类型字段在第一次执行时可见,这对于能够直接查看 TEXT 字段中的数据也很有用。您始终可以单击该字段来告诉 Toad 显示该字段,但这是一个两步过程。
        • 请注意,这可能会使您的查询non-sargable
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多