Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按文本大小写排序_Sql_Sql Server - Fatal编程技术网

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