例如,我在 SQL 2012 中有一个表,我们可以将其称为“表”。里面有这样的东西,
Column
_one
_two
three_blah
four_blah
我希望能够做到这一点,
select * from Table order by Column
结果是这样的,
four_blah
one
three_blah
two
因此,它根据删除前导下划线字符对项目进行排序。它不能只是盲目地删除下划线字符,因为下划线可能位于项目的中间。
例如这不起作用,
select Replace(Column, '_', '') from Table order by Replace(Column, '_', '')
假设 col 限制为 255 个字符,则不必对长度或复杂的 case 表达式进行任何检查:
更新以显示一个适用于 varchar 的示例,即使我硬编码的值超过了列的大小:
结果:
另一种选择(不需要硬编码字符串的长度或确定表中每个值的长度)是使用 STUFF。请注意,这确实会改变没有单个字母字符的字符串的处理方式(NULL 输出而不是单独存在)。这些行仍将首先排序,只是意义不大。您可以通过添加来处理您喜欢的那些
COALESCE
。(这部分答案应该归功于@MikaelEriksson。)
以下内容有点棘手,但我发现唯一可以替换字符串头部重复字符的函数是函数 LTRIM。我没有找到任何可以完成这项工作的正则表达式函数(如在其他语言中发现的那样)。
与当前提出的其他解决方案不同,它可以处理不同数量的前导下划线和包含任意字符的字符串。
col 应该是列的名称。然后下面的表达式将在每个位置包含一个空格,其中 col 包含一个下划线,表达式包含一个非空格,其中 col 包含一个非下划线(当然可以使用另一个字符而不是 # 除了下划线和空格)
现在我计算所需字符串的长度:
知道所需字符串的长度可以很容易地使用 RIGHT 从 col 计算所需的字符串
编辑:
现在我找到了另一个表达式来完成这项工作:
例如
回报:
这个怎么样?
这是我的头顶,所以它未经测试......