SQL Server“文本”数据类型上的WHERE子句


90

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

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

我得到错误:

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

我不能使用WHERE子句查询此数据类型吗?


9
使用VARCHAR(MAX)代替TEXT-不赞成使用该数据类型
marc_s 2010年

Answers:


101

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

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

SELECT *
FROM   @Village
WHERE  [CastleType] LIKE 'foo' 

text不推荐使用。更改为varchar(max)将更容易使用。

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


20

请尝试这个

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

如果您正在使用Toad for Sql Server之类的工具来保护BLOB类型字段在首次执行时可见,这对于直接在TEXT字段中查看数据也很有用。您始终可以单击该字段来告诉Toad显示该字段,但这是一个两步过程。
罗杰

请注意,这可能会使您的查询不可修改
Heinzi

13

您不能text=运算符进行比较,而必须使用此处列出的比较功能之一。还要注意页面顶部的大警告框,这一点很重要。


5

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

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

2

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


Col IN ('foo', 'bar')基本上Col = 'foo' or Col = 'bar'和都会有相同的问题
马丁·史密斯

@马丁:谢谢您的精彩表演,我对此一无所知。那我会改正的。
Will Marcouiller 2010年

0

另一种选择是:

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

我怀疑这like 'foo'可能会提供比这种方法更好的基数估计,但不确定100%。
马丁·史密斯

@Martin:由于您无法索引TEXT列,因此我认为无论哪种情况,您都将进行全表扫描。
Joe Stefanelli 2010年

我同意,但它仍然会使用该列的统计数据来获得将要返回的行的估计,这可能会影响等参加决策
马丁·史密斯

0

这适用于MSSQL和MySQL:

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

1
OP使用的是MSSQL,而不是MySQL。
Deckard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.