Sql 按文本大小写排序
我有一个主题表,我需要排序-如果主题是核心主题,那么它需要排在第一位(按排序顺序排序),如果它不是核心主题,那么它需要按字母顺序排序 我用一张示例表摆好了一把小提琴: 我试过的代码是:Sql 按文本大小写排序,sql,sql-server,Sql,Sql Server,我有一个主题表,我需要排序-如果主题是核心主题,那么它需要排在第一位(按排序顺序排序),如果它不是核心主题,那么它需要按字母顺序排序 我用一张示例表摆好了一把小提琴: 我试过的代码是: SELECT * FROM subject ORDER BY CASE WHEN IsCore=1 THEN SortOrder ELSE [Description] END 我收到此错误“将varchar值“Science”转换为数据类型int时转换失败” 我希望按照以下顺序获得主题:
SELECT * FROM subject
ORDER BY CASE
WHEN IsCore=1 THEN SortOrder
ELSE [Description]
END
我收到此错误“将varchar值“Science”转换为数据类型int时转换失败”
我希望按照以下顺序获得主题:
- 数学
- 阅读
- 书写
- 艺术
- 计算
- 科学
有人能建议我应该如何进行排序吗?A
CASE
表达式返回标量值,并用于确定返回类型。显然,SortOrder
是一个int
,因此具有比Description
的varchar
数据类型更高的数据类型优先级。因此,您需要使用一些表达式。我假设您首先需要具有IsCore=1
的行,然后按SortOrder
排序,然后使用列Description
ORDER BY CASE WHEN IsCore = 1 THEN 0 ELSE 1 END,
CASE WHEN IsCore = 1 THEN SortOrder END,
Description;
像这样:
SELECT * FROM subject
ORDER BY
IsCore DESC,
CASE IsCore WHEN 1 THEN [SortOrder] END,
[Description]
只需使用CASE
语句对IsCore=1
的行进行排序请参阅。
结果:
我会这样做:
SELECT [SubjectId], [SortOrder], [Description], [IsCore]
FROM subject
ORDER BY IsCore DESC, -- Everything with 1 in IsCore will come first
CASE WHEN IsCore = 1
THEN [SortOrder] -- use SortOrder for IsCore 1
ELSE ROW_NUMBER() OVER(ORDER BY [Description]) -- row number is alphabeticaly oredered
END
请注意,大小写表达式必须在其所有分支中返回兼容的数据类型,这意味着它只返回单个数据类型,这是其所有分支中类型集中优先级最高的类型。假设
IsCore
始终为0/1,可以使用单个条件将其表示为:
ORDER BY ROW_NUMBER() OVER (ORDER BY IsCore DESC,
SortOrder * - IsCore,
Description
)
或:
他是个小提琴手
然而,拉努的解决方案更易于解释。@forpas。非常感谢。事实上,正确的解决方案更简单。如果删除无用的row_number(),就更简单了。
ORDER BY ROW_NUMBER() OVER (ORDER BY IsCore DESC,
SortOrder * - IsCore,
Description
)
ORDER BY ORDER BY IsCore DESC,
SortOrder * - IsCore,
Description