2010-12-19 106 views
-1

假設我想通過稱爲STORY_LENGTH的字段(字符串數據類型)對記錄順序進行排序。該字段是一個多值字段,我用逗號表示多個值。例如,對於記錄1,其值爲「1」,記錄2的值爲「1,3」,對於記錄3,其值爲「1,2」。現在,當我想訂購根據STORY_LENGTH的記錄時,則記錄的排列方式如下record1 > record3 > record2。其明確指出STORY_LENGTH數據類型是字符串,order by ASC將該值視爲字符串排序。但是,問題來了。例如,當record4="10"record5="2",我嘗試訂購它看起來像record4 > record5,這顯然我不想。因爲2 > 10和我正在使用字符串格式,只是因爲字段的多個值。所以,任何人,你能幫我解決這個問題嗎?我需要一些好主意來解決。 謝謝如何按字母順序處理字符串排序?

+1

修復您的設計。簡單。 – gbn 2010-12-19 20:43:51

回答

5

您所描述的多值字段意味着您的數據模型已損壞,應爲normalized

一旦完成,查詢變得更加簡單。

+0

該字段將包含幾個相同類型的值。例如一首歌曲將有兩種長度:10,15或單一的10.目前在這種情況下,數據庫設計不能改變.. – 2010-12-19 19:03:20

+0

@穆蘇拉赫曼 - 這是不幸的。您可能想使用LIKE運算符來查看解決方案,並在應用程序中執行字符串處理和篩選,而不是使用數據庫。 – Oded 2010-12-19 19:05:19

0

從我所瞭解的你想要排序的項目由第二或第一個數字在逗號分隔值存儲在一個VARCHAR字段。實施將取決於數據庫的使用,例如在MySQL它會是什麼樣子:

SELECT * FROM stories 
ORDER BY CAST(COALESCE(SUBSTRING_INDEX(story_length, ',', -1), '0') AS INTEGER) 

然而,這不是一般的不好用這樣的排序性能方面的原因如排序將需要全表掃描,而不是使用指數領域。

編輯:編輯後,它看起來像你想排序第一個值,忽略逗號後的值。正如根據上面的評論,數據庫設計的變化不是一種選擇,只是使用以下代碼進行分類:

SELECT * FROM stories 
ORDER BY CAST(COALESCE(NULLIF(SUBSTRING_INDEX(story_length, ',', 1), ''), '0') AS INTEGER) 
+0

謝謝。看上去不錯。我會盡力並提供反饋 – 2010-12-20 06:23:16