按插入方式对字符串进行排序

时间:2016-05-19 17:57:59

标签: mysql sql sql-server

场景:我的表有单列(字符串)。我想检索以特定顺序存储的数据。

表Tbl_EmployeeName只有一列“名称”

我通过以下查询插入记录

Insert Into Tbl_EmployeeName
select 'Z'
union
select 'y'
union
select 'x'
union 
select 'w'
union
select 'v'
union
select 'u'
union
select 't'
union
select 's'

现在我希望这些记录的插入顺序与插入顺序相同。 当我运行查询时:

select * from Tbl_EmployeeName 

它将按名称asc按默认顺序排列记录。 即

结果输出

s                                                
t                                                
u                                               
v                                               
w                                              
x                                                 
y                                                 
Z 

我想以这种方式记录所有记录

预期产出

z
y
x
w
v
u
t
s

请问您是否有任何方法可以按正确顺序输入记录,并且不会在表格中添加任何新列。

3 个答案:

答案 0 :(得分:1)

  

我通过以下查询插入记录

     

...query using union...

     

现在我希望这些记录的插入顺序与其相同。

令人惊讶的是, 按照插入顺序检索记录。在UNION上的每个SELECT语句之间使用INSERT会导致在插入之前对记录进行排序。 UNION对所有结果都有固有的DISTINCT。将其切换为UNION ALL将消除固有的排序。

...无论其

  

您能否建议我以正确的顺序输入记录,并且不向表中添加任何新列。

不幸的是,可能。 SQL表表示无序集。它没有记录顺序或它们被插入顺序的原生概念。

  

当我运行查询select * from Tbl_EmployeeName时   它将按名称asc。

按默认顺序排列记录

这是错误的。如上所述,返回的是 no 默认顺序。执行该查询时可能得到的任何结果都只是巧合。如果不指定ORDER BY子句,则订单保证。

  

请您建议我有什么方法可以按照正确的顺序输入记录

与您的问题相反,您可以通过在表格中添加新列来实现此目的。通过如下设置表:

Create Table Tbl_EmployeeName 
(
    Id    Int Identity(1,1) Not Null,
    Name  Varchar (10) -- Or whatever your size is
);

然后进行插入:

Insert  Tbl_EmployeeName 
        (Name)
Values  ('Z'),
        ('y'),
        ('x'),
        ('w'),
        ('v'),
        ('u'),
        ('t'),
        ('s')

并查询:

Select  Name
From    Tbl_EmployeeName
Order By Id Asc

答案 1 :(得分:0)

您可以使用 FIND_IN_SET

按自己的顺序对其进行排序
SELECT * 
FROM Tbl_EmployeeName 
ORDER BY FIND_IN_SET(Name,'Z,y,x,w,v,u,t,s');

如果你不知道插入顺序使用它,那么直接有一个AUTOINCREMENT字段。

CREATE TABLE `Tbl_EmployeeName` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    SELECT * 
    FROM Tbl_EmployeeName 
ORDER by id;

答案 2 :(得分:0)

不幸的是,除非指定了ORDER BY子句,否则无法保证在结果集中返回行的顺序。 source

如果可能,您需要添加一个新列,用于存储输入时间或您可以订购的序列。

我会推荐一个键/序列,因为这可以用来更有效地加入其他表(source)。