我正在尝试创建一个存储过程,该存储过程将允许调用者指定是否要按列排序。该参数应该是可选的。我正在使用SQL Server Express
@sortBy VARHCAR(255) = ''
BEGIN
SELECT * FROM Document
ORDER BY
CASE @sortBy
WHEN 'documentId' THEN documentId
WHEN 'documentName' THEN documentName
WHEN 'dateCreated' THEN dateCreated
WHEN 'dateLastAccessed' THEN dateLastAccessed
ELSE documentName
END;
END
我可以创建该过程,但是当我执行该过程时,会收到以下消息
Conversion failed when converting date and/or time from character string.
dateCreated和dateLastAccessed的类型为DATE,但我无法确定它们是否是罪魁祸首。我是否意外地告诉数据库使用此过程转换日期/时间?这是我第一次使用存储过程的可选参数,因此我可能做的不正确。感谢您的帮助
谢谢
答案 0 :(得分:3)
正如Tim和Sean在评论中所写,case表达式只能返回单个数据类型。
当每个选项包含不同的数据类型时,SQL Server尝试将所有数据类型隐式转换为优先级更高的数据类型(see the list here)。
您可以通过使用稍微麻烦一些的查询来克服此问题:
SELECT *
FROM Document
ORDER BY
CASE WHEN @sortBy = 'documentId' THEN documentId END,
CASE WHEN @sortBy = 'documentName' THEN documentName END,
CASE WHEN @sortBy = 'dateCreated' THEN dateCreated END,
CASE WHEN @sortBy = 'dateLastAccessed' THEN dateLastAccessed END;
请注意,如果不指定else
部分,则case
表达式将返回null
-这样就不会影响记录的整体顺序。
答案 1 :(得分:0)
首先,动态排序不适用于混合数据类型。也就是说,如果您具有要按其排序的不同数据类型的字段-例如varchars和date。您需要使用CONVERT将不匹配的数据类型转换为与其他数据类型相同的数据类型。或者您可以使用动态sql。也许更容易:))
n=(df.shape[1]-1)//2
df[df.eq(0).sum(1)<n]
Out[589]:
1 2 3 4 5
0 ENSG0001 0 74 54 2
2 ENSG0003 3 4 2 24