下轉換排序鍵,以便在正常情況下,敏感的排序產生的請求結果爲:
如果有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功能未經測試。
嗨丹,這可能是一個解決方案。坦克! – Jonah