2012-09-13 62 views
0

爲了簡化問題:我有一個包含一列的數據庫表。在這一列中可以存儲用戶的任何文本(所以我們有動態數據)。現在讓我們說我存儲的 示例數據:對MS Access數據庫中的表中的數據進行排序

[a1, a2, a3, a20, a21]

當我現在選擇從表中的數據,我希望它進行排序是這樣的:

a1, a2, a3, a20, a21 

,而不是像這樣:

a1, a2, a20, a21, a3 

有無需編寫複雜的方式算法(因爲我使用Access2007並希望將表或任何查詢綁定到表單中的元素),但只使用sql。

請注意: 如果用戶只能插入數字,則列類型可以簡單地更改爲數字。然後它會按正確的方式排序。但我也必須處理字母和特殊字符。

+1

是存儲這樣的'A1,A2,A3,A20一列中的數據,a21'?或者是那些多行? – Taryn

+0

在輸入的數據中是否存在一致性? I.e它會永遠是一個Alpha然後Numerics? N99或N9。或者你可以有N9N999N例如?您正在查看的複雜算法。你想在SQL還是VBA中做到這一點。要麼可以完成。 –

+0

一切皆有可能。這意味着像a1b99ccc(t)/ d100這樣的數據。它是一個單獨的列,我想在sql中完成。 – Hauke

回答

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 
+0

嗨,SQL是一個通用的標記,所需的特殊風味是MS Access,所以我擔心所有的SQL Server類型的SQL都不起作用。 – Fionnuala