40

电子邮件属于餐桌预订,在我们的 Microsoft sql server 中定义为“文本”类型

SELECT email, 
 COUNT(email) AS NumOccurrences
FROM Booking
GROUP BY email
HAVING ( COUNT(email) > 1 )

运行上述查询(尝试在预订中查找重复的电子邮件)后,我收到如下错误消息:

text、ntext 和 image 数据类型不能进行比较或排序,除非使用 IS NULL 或 LIKE 运算符。

我正在使用 Microsoft Sql

4

2 回答 2

74

既然你在用SQL Server,为什么不把数据类型改成VARCHAR(100)呢?

要在不更改数据类型的情况下解决此错误,TEXT or NTEXT需要将列转换为VARCHAR or NVARCHAR在语句的ORDER BY子句或GROUP BY子句中使用时SELECT。例如,有点乱

SELECT  CAST(email AS NVARCHAR(100)) email, 
        COUNT(CAST(email AS NVARCHAR(100))) AS NumOccurrences
FROM    Booking
GROUP   BY CAST(email AS NVARCHAR(100))
HAVING  COUNT(CAST(email AS NVARCHAR(100))) > 1 
于 2013-02-20T12:05:36.843 回答
0

由于我的 ORM 存在问题,我对接受的答案有疑问。此答案只是在接受的答案不起作用时的解决方法,并且仅当您只有 group by 中的列时才有效,因为它是必需的,因此您可以在选择中包含该列。

它在聚合函数内部强制转换列,因此在group by中不需要它,并且不会发生错误并且返回的数据应该仍然是正确的。

MIN(CAST(email AS NVARCHAR(4000))) as email

理想情况下,您会找到一种方法来避免这种黑客攻击,但这在某些情况下可能很有用。

于 2018-07-20T16:37:07.717 回答