将 NTEXT 列与常量值进行比较的正确方法是啥?

Posted

技术标签:

【中文标题】将 NTEXT 列与常量值进行比较的正确方法是啥?【英文标题】:What's the right way to compare an NTEXT column with a constant value?将 NTEXT 列与常量值进行比较的正确方法是什么? 【发布时间】:2010-08-22 21:49:59 【问题描述】:

如果我使用类似的东西

[ntext2] <> '1,032.5',

我收到此错误:

数据类型ntext和varchar在不等于运算符中不兼容。

最好的解决方案是对任何列类型都以相同的方式实现比较。 ( 运算符适用于 NVARCHAR 和 INT)。

【问题讨论】:

将其转换为 NVARCHAR(MAX) 并且所有字符串函数都可供您使用... NTEXT 很乱,它已被弃用 - 摆脱它! 如果有人要求 M$ 将其 CRM DB 的 NTEXT 转换为 NVARCHAR,我将签署请愿书 ;) 【参考方案1】:

ntext 数据类型已弃用,取而代之的是 nvarchar(max) 数据类型。如果您可以更改表中的数据类型,那将是最好的解决方案。然后将其与 varchar 文字进行比较就没有问题了。

否则,您必须在比较之前转换该值:

cast([ntext2] as nvarchar(max)) <> '1,032.5'

您也可以考虑使用 nvarchar 文字,它可以解决一些类似的数据类型问题:

cast([ntext2] as nvarchar(max)) <> N'1,032.5'

【讨论】:

不幸的是,这不是一个选项,因为 MS 自己使用 ntext,尽管它同时声明它已弃用。我会尝试 N 前缀和强制转换,谢谢你的回答。【参考方案2】:

如果您不想投射,您可以在某些情况下使用 LIKEPATINDEX,如此 MSDN 线程所示:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

不带通配符的 LIKE 表达式(在这种情况下)大致相当于相等性测试。

在这种情况下,表达式为:

[ntext2] NOT LIKE '1,032.5'

【讨论】:

LIKE 需要正确索引数据库(AFAIK)。我想避免这种要求。 @noober:LIKE 子句从索引中受益不大,除非它们不包含前导通配符。演员表可能会忽略现有索引。如果您担心性能,最好在有和没有索引的情况下测试每个选项(cast、like、patindex)的性能。如果我今天有时间,我会去看看。 不,我刚刚在不同的 DB 上使用 NTEXT 测试了 LIKE,但其中一个失败了。就是无法执行。问题出在索引上。所以我不能确定 LIKE 在任何地方都可以使用。 @noober:如果您不介意发布错误,我很想看看这个错误。 糟糕...现在可以使用了。很奇怪。如果我再看到这个,我会告诉你的。

以上是关于将 NTEXT 列与常量值进行比较的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将Pandas DataFrame中的2列与.loc进行比较

在机器对机器通信场景中使用的正确字符串比较值是啥?

Excel 2010 比较多列(2 列与其他 2 列)

为常量编写 PHPDocs 的正确方法是啥?

在 Pandas 中将两列与 NaN 进行比较并获得差异

HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?