【问题标题】:Order by multiple column first with alphabet then numbers先按多列排序,先用字母,再用数字
【发布时间】:2021-05-26 09:59:43
【问题描述】:

尝试将 DB2 查询 ORDER BY 条件转换为 SQL Server

DB2 查询

ORDER BY 
CASE WHEN LEN(RTRIM(LTRIM(CorpName))) > 1 THEN CorpVal Else '999' END,
CASE WHEN SUBSTRING(FName,1,1) != '*' THEN FName Else '999'  END

SQL 查询

ORDER BY 
CASE WHEN CorpName like '[a-z]%' THEN 0 ELSE 1 END,
CASE WHEN FName like '[a-z]%' THEN 0 ELSE 1 END

我有类似的数据

ABC, 24KS, 安倍, 阿杰西, -额外的, ABF, 1X1

我需要如下输出

ABC, 安倍, ABF, 阿杰西, 24KS, 1X1, -额外的

这对我不起作用,需要更多建议。

【问题讨论】:

  • 第一个查询,即 DB2 查询,也可以在 SQL Server 中工作。 LENRTRIMLTRIMSUBSTRING也是T-SQL中的函数,还支持CASE表达式。如果你有一个有效的表达式,为什么要改变它?
  • 样本数据也有助于您的问题更容易理解。
  • @Larnu 我同意,我的想法是一样的,但它的行为不同,我的意思是在 DB2 中它按预期工作,但在 SQL Server 中使用此条件时它不工作
  • “不工作”是什么意思?
  • @Larnu 不工作意味着,不排序.. 所以在 DB2 数据排序为 ABC、PQR、24KS 和 SQL Server 它显示 24KS、ABC、PQR

标签: sql-server sql-order-by db2-400


【解决方案1】:

排序由SQL ServerDB2 中的排序规则决定。似乎您的 iSeries DB2 配置了 EBCDIC 排序规则,因此您可以在 ORDER BY 表达式中添加显式 COLLATE 子句来强制 SQL Server 的 EBCDIC 排序规则,因为您的 SQL Server 排序规则显然不同。

以下是原始 DB2 查询的示例,其中为 SQL Server 添加了子句:

ORDER BY 
CASE WHEN LEN(RTRIM(LTRIM(CorpName))) > 1 THEN CorpVal Else '999' END COLLATE SQL_EBCDIC037_CP1_CS_AS,
CASE WHEN SUBSTRING(FName,1,1) != '*' THEN FName Else '999'  END COLLATE SQL_EBCDIC037_CP1_CS_AS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多