0

为了简化问题:我有一个包含一列的数据库表。在此列中可以存储用户的任何文本(因此我们有动态数据)。现在假设我存储示例数据:

[a1, a2, a3, a20, a21].

当我现在从表中选择数据时,我希望它像这样排序:

a1, a2, a3, a20, a21

而不是这样:

a1, a2, a20, a21, a3

有没有办法不用写复杂的算法(因为我用的是Access2007,想把表或任何查询绑定到表单中的一个元素),但只用sql。

请注意:如果用户只插入数字,列类型可以简单地更改为数字。然后它将以正确的方式排序。但我还必须处理字母和特殊字符。

4

1 回答 1

0

您所要求的有几个步骤,每个步骤都有其自身的困难,这意味着您想使用 SQL 来完成。您在问题上的短语without writing a complex algorithm和评论Everything is possible不兼容。Everything is possible为您尝试做的事情增加了很多复杂性,主要是因为 sql 没有做您在这里尝试做的事情。

  • 首先验证字符串的格式:是的,可以,但是 SQL 是一种查询语言,如果可能,最好对外部的任何格式进行处理
  • 然后将其拆分,考虑到可能出现的所有不同可能性:同样,SQL 不是为此而设计的,您可以这样做,但是您的数据有很多不同的情况
  • 最后对值进行排序:再次排序并返回单个字符串。排序是在一个集合上完成的,而不是在一个值链中,但当然可以完成

@Remou 在评论中所说的是,您应该将这些值放在不同的行上,而不是列上的所有值。例如:

id    value
1      a1
2      a41
3      s2
4      a52
5      a1b99ccc

从这里你可以开始做一些订购。您可以做的第一步是将字符串拆分为几行,保存在临时表上,然后从这里您可以使用一些东西。您可以使用以下代码段在行上拆分字符串:

DECLARE @str NVARCHAR(100)= 'T,23,3434,332SB,1-1KD', @separator VARCHAR(1)= ','
DECLARE @SplitedList  TABLE (code NVARCHAR(30))

DECLARE @XMLList XML
SET @XMLList=CAST('<i>'+REPLACE(@str, @separator,'</i><i>')+'</i>' AS XML)

INSERT INTO @SplitedList
SELECT x.i.value('(./text())[1]','varchar(100)')
FROM @XMLList.nodes('i') x(i)

SELECT * FROM @SplitedList
于 2012-09-13T13:22:30.593 回答