2012-06-07 36 views
2

我想这将是一个容易解决的问题,但我一直在疯狂地搜索Google,试图找到答案,我只是没有得到答案。按包含空值的列进行排序?

我想根据包含空值的列对结果进行排序。 SQL Server似乎认为这是一个坏主意。我试着用ISNULLLIKE以及其他一些方法来限制它们,试图让它起作用,而这只是没有发生。

SELECT c1 
FROM t1 
WHERE c1 IS NOT NULL 
ORDER BY c1 DESC 

SQL Server为我这个错误: The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

就像我说的,我一直在使用Google像疯了似的试图找到答案这个简单的问题,它只是没有发生。

+1

如果我没有弄错,SQL Server不会抱怨NULL值,它抱怨说它不能排序文本,ntext或图像数据类型。 –

+1

要添加到该评论,请查看MSDN页面上的限制部分:http://msdn.microsoft.com/en-us/library/ms188385.aspx如果将它作为varchar进行投射,则应该可以将其排序问题 –

+1

我假设它是'text/ntext'类型。而不是引入'Order By'子句,为什么不是最初'Varchar(max)'设计的? – 2012-06-07 17:55:09

回答

3

C1是文本,ntext或图像

,以便将错误说你不能命令他们

尝试铸造文/ NTEXT为varchar(最大值)应该这样做。

SELECT c1 
FROM t1 
WHERE c1 IS NOT NULL 
ORDER BY convert(varchar(max),c1) DESC 
+0

正如John Nolan所说,文本,ntext或图像是特殊的,因为它们实际上被存储为lob,这使得它们不易折叠。如果您使用ntext,则转换为varchar(max)(或nvarchar(max))应允许您排序。 – Zhenny

+0

啊,我甚至没有注意到它们将它存储为** text **值而不是** varchar **。我想这就是为什么我找不到答案。 :)我只是以为这是由于包含空值的列。 – mawburn

1
ORDER BY cast(c1 as varchar(max)) DESC 

和考虑切换列c1的类型varchar(max)textobsolete data type

+0

表中每条记录的大小是一个性能参数。那么为什么要为子句“Varchar(max)'? – 2012-06-07 17:45:29

+0

@PankajGarg:'varchar(max)'是可变长度(因此名称为varchar)。 F.E. 'cast('abc'as varchar(max))'占用三个字节。 – Andomar

+0

是的。这仅仅是一个单元格。你知道对应于查询的读取吗? – 2012-06-07 17:51:17

0

我发现一些说你只能排序varchar。试试这段代码。

SELECT C1 FROM T1 WHERE C1 IS NOT NULL ORDER BY铸造(C1为varchar(MAX))

SRC:HTTP://twogeeks.mindchronicles.com/ P = 7

+0

BUt为什么我应该按每个单元的2GB大小进行排序? – 2012-06-07 17:42:31

相关问题