Sql server 有没有办法在字符串的开头放一个不可见的字符来改变它的排序顺序?

Sql server 有没有办法在字符串的开头放一个不可见的字符来改变它的排序顺序?,sql-server,tsql,sorting,Sql Server,Tsql,Sorting,是否有任何方法可以在sqlserver中的数据字符串开头放置非打印或非突出字符。因此,当执行按排序时,字符串按字母z的字母顺序排序 我在字符串的开头使用了一个空格来将字符串放在排序列表的顶部,但是我希望做一些类似的事情,将字符串放在列表的末尾 我不希望在表中放置另一个字段,如“SortOrder”,以用于排序,也不希望在代码中对列表进行排序 补充:是的,我知道这是一个坏主意,感谢大家提到它,但我仍然很好奇我所要求的是否可以实现您应该使用数据库中的另一列来帮助指定顺序,而不是修改字符串: SELE

是否有任何方法可以在sqlserver中的数据字符串开头放置非打印或非突出字符。因此,当执行按排序时,字符串按字母z的字母顺序排序

我在字符串的开头使用了一个空格来将字符串放在排序列表的顶部,但是我希望做一些类似的事情,将字符串放在列表的末尾

我不希望在表中放置另一个字段,如“SortOrder”,以用于排序,也不希望在代码中对列表进行排序


补充:是的,我知道这是一个坏主意,感谢大家提到它,但我仍然很好奇我所要求的是否可以实现

您应该使用数据库中的另一列来帮助指定顺序,而不是修改字符串:

SELECT *
FROM yourtable 
ORDER BY sortorder, yourstring
您的数据可能如下所示:

yourstring               sortorder
foo                      0
bar                      0
baz                      1
qux                      1
quux                     2
如果无法修改该表,则可以将sortorder列放入另一个表中,并进行连接以获得它:

SELECT *
FROM yourtable AS T1
JOIN yourtablesorting AS T2
ON T1.id = T2.T1_id
ORDER BY T2.sortorder, T1.yourstring

替代解决方案:

如果您根本无法修改数据库,甚至无法添加新表,则可以在字符串开头添加任何您喜欢的字符,并在选择过程中删除它:

SELECT RIGHT(yourstring, LEN(yourstring) - 1)
FROM yourtable
ORDER BY yourstring

你能包括以下内容吗

"<SORT1>This is my string"
"<SORT2>I'd like this to go second"
“这是我的字符串”
“我希望这是第二个”

以后再移除它们?我认为使用看不见的字符是脆弱的和有攻击性的。

在我看来,使用看不见的字符是个坏主意,因为它会污染数据。我会做你不想做的事情,并添加一个新的专栏


要稍微修改这个想法,您可以将其实现为分组顺序,而不是排序顺序。默认情况下,分组顺序为0,其中负整数将组置于列表顶部,正整数置于底部,然后“按排序优先级排序,foo”

您可以在查询中设置排序顺序并使用联合(不保证性能)


我和其他人一样认为,实现这一点的理想方法是为排序顺序添加一个额外的列

但是,如果您不想添加另一列,并且您已经为那些要显示在列表顶部的项目使用了一个空格,那么对于使用管道(|)来显示列表底部的项目,您感觉如何


,SQL Server使用Unicode字符集进行排序。在中,管道和两个花括号({,})位于z之后,因此这三个字符中的任何一个都应该适合您。

因为没有人敢正确回答您的问题,下面是我的答案

给定:您已经将
添加到一些其他数据中,以使它们显示在顶部

解决方案:添加字符(160)使其显示在底部。这实际上也是一个空间,但设计用于计算机系统,使其不会将其视为断字(因此得名)

您的要求:

  • 不向表中添加其他字段,如“SortOrder”
  • 没有在代码中对列表进行排序
  • 我觉得这个合适

    create table my(id int,data varchar(100))
    insert my
    select 1,'Banana' union all
    select 2,Char(160) + 'mustappearlast' union all
    select 3,' ' +N'mustappearfirst' union all
    select 4,'apple' union all
    select 5,'pear'
    
    select *
    from my
    order by ASCII(lower(data)), data
    

    (好吧,我作弊了,我不得不添加
    ASCII(较低(
    但这比目前所有其他答案更接近您的要求)

    @Mark我认为这是最好的解决方案,但OP明确表示“我不想再添加另一个字段,如“SortOrder”在用于排序的表格中,“+1”尽管OP有明确的要求,但我仍然认为这是一条路。@Skilldrick:说得好!我没有读到那么多…但是我仍然建议这样做。如果表格无法修改,或许列可以位于另一个表格中…其他选项可能会使这更令人满意:使对计算列进行排序。如果无法更改基表,请在基表上创建一个视图,并添加排序列。@标记。是的,我知道最好按另一列排序或在代码中进行处理(我在问题中提到了这两种可能性),但我仍然很好奇我所要求的是否可以实现。当然,这是mark所描述的,但他在我之前点击了post!+1,因为这是一个好主意。小修改:可以在同一个SQL语句中完成。对子字符串排序?我不清楚你在说什么envisioning@OMG这里的小马是示例字符串值:1、2、4、three、 苹果。我想把它们分类为苹果,一,三,二,四。我知道分类的部分,我不知道你打算怎么用它来分类。你怎么知道“四”是最后一个吗?@OMG Ponies尝试这个字符串示例。我在上一个示例中使用了一个格式字符。以下是示例字符串值:1,2,!4!,3,apple。我希望它们按apple,1,3,2和!4!排序。-Lill Lansey这是到目前为止最接近我所寻找的字符串。从那些特殊的字符mov开始将字符串插入排序的顶部。
    create table my(id int,data varchar(100))
    insert my
    select 1,'Banana' union all
    select 2,Char(160) + 'mustappearlast' union all
    select 3,' ' +N'mustappearfirst' union all
    select 4,'apple' union all
    select 5,'pear'
    
    select *
    from my
    order by ASCII(lower(data)), data