2017-01-30 145 views
0

我在SQLite 中搜索特殊類型的查詢來排序註釋表。sqlite高級區分大小寫查詢

從查詢結果應該是這樣的:

id oid 
1 1 
2 1,1 
5 1,1,a 
6 1,1,a,1 
3 1,1,A 
4 1,1,A,1 

但隨着folling代碼,我收到這樣的:

CREATE TABLE note (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
created DATETIME DEFAULT CURRENT_TIMESTAMP, 
oid VARCHAR unique, 
tit VARCHAR, 
dsc VARCHAR 
); 

select id, oid from note 
order by oid collate NOCASE 

結果:

id oid 
1 1 
2 1,1 
5 1,1,a 
3 1,1,A 
6 1,1,a,1 
4 1,1,A,1 

有什麼建議?

感謝 --jonah

回答

1

您獲得的結果,因爲排序pecified是NOCASE。這意味着「a」和「A」等於。因此,首先「a/A」之後的行以及之後的行,然後是「a/A」以及之後的數據行。

如果您進行查詢CASE SENSITIVE,您將得到不同的結果。但「一個」來befores「一個」在區分大小寫排序:

SELECT id, oid 
FROM note 
ORDER by oid 

結果:

1 "1" 
2 "1,1" 
5 "1,1,A" 
6 "1,1,A,1" 
3 "1,1,a" 
4 "1,1,a,1" 
2

下轉換排序鍵,以便在正常情況下,敏感的排序產生的請求結果爲:

如果有togglecase()函數,函數會使用大寫的小寫和小寫的大寫(例如Hello =>hELLO),可能會有ORDER BY togglecase(oid),結果將按請求的順序排列。

您可以定義這樣一個函數並將其作爲UDF公開給SQLite。使用內建的SQLite函數編寫這個函數也是可能的,但我不太瞭解它們以使用它們給出答案。下面是這樣一個功能在Python的例子:

def togglecase(s): 
    def toggle(l): 
     if l.isupper(): 
      return l.lower() 
     if l.islower(): 
      return l.upper() 
     return l 
    return ''.join(toggle(l) 
        for l in s) 

注意,正確的Unicode支持,它需要遍歷字形。不超過代碼點。

看到這個做什麼,我描述它做的事:

>>> togglecase("1,1,A") 
'1,1,a' 
>>> togglecase("1,1,a") 
'1,1,A' 

它可以測試,如果這個正確排序在Python:

>>> sorted(["1", "1,1", "1,1,a", "1,1,a,1", "1,1,A", "1,1,A,1"]) 
['1', '1,1', '1,1,A', '1,1,A,1', '1,1,a', '1,1,a,1'] 

見大寫如何遵循小寫:

>> sorted(["1", "1,1", "1,1,a", "1,1,a,1", "1,1,A", "1,1,A,1"], key=togglecase) 
['1', '1,1', '1,1,a', '1,1,a,1', '1,1,A', '1,1,A,1'] 

現在,如果你在SQLite中使用它:

SELECT id, oid 
FROM note 
ORDER BY togglecase(oid) 

這將導致:

1 "1" 
2 "1,1" 
3 "1,1,a" 
4 "1,1,a,1" 
5 "1,1,A" 
6 "1,1,A,1" 

的代碼是除togglecase功能未經測試。

+0

嗨丹,這可能是一個解決方案。坦克! – Jonah