sqlite高级区分大小写查询
我在SQLite中搜索一种特殊的查询 对notes表进行排序 查询的结果应如下所示:sqlite高级区分大小写查询,sqlite,Sqlite,我在SQLite中搜索一种特殊的查询 对notes表进行排序 查询的结果应如下所示: 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 但通过这些愚蠢的代码,我收到了这样的信息: CREATE TABLE note ( id INTEGER PRIMARY KEY AUTOINCREMENT, created DATETIME DEFAULT CURRENT_TIMESTAMP, oid VARCHA
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
但通过这些愚蠢的代码,我收到了这样的信息:
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您得到这个结果是因为排序被指定为NOCASE。这意味着“a”和“a”是相等的。因此,首先是后面有“a/a”和“nothing”的行,然后是后面有“a/a”和数据的行 如果将查询区分大小写,将得到不同的结果。但在区分大小写的排序中,“A”优先于“A”:
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"
您得到该结果是因为排序被指定为NOCASE。这意味着“a”和“a”是相等的。因此,首先是后面有“a/a”和“nothing”的行,然后是后面有“a/a”和数据的行 如果将查询区分大小写,将得到不同的结果。但在区分大小写的排序中,“A”优先于“A”:
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"
下面将转换排序键,以便正常区分大小写的排序产生请求的结果: 如果有一个
togglecase()
函数,该函数将是大写-小写和小写-大写(例如Hello
=>Hello
),可以按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)
>>> 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']
注意,为了获得正确的Unicode支持,它需要在graphemes上迭代。不要超过代码点
请确保这与我描述的一样:
>>> togglecase("1,1,A")
'1,1,a'
>>> togglecase("1,1,a")
'1,1,A'
可以在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)
>>> 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函数外,该代码未经测试。以下转换排序键,以便正常区分大小写的排序产生请求的结果: 如果有一个
togglecase()
函数,该函数将是大写-小写和小写-大写(例如Hello
=>Hello
),可以按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)
>>> 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']
注意,为了获得正确的Unicode支持,它需要在graphemes上迭代。不要超过代码点
请确保这与我描述的一样:
>>> togglecase("1,1,A")
'1,1,a'
>>> togglecase("1,1,a")
'1,1,A'
可以在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)
>>> 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函数外,该代码未经测试。Hi Dan,这可能是一个解决方案。坦克!嗨,丹,这可能是个解决办法。坦克!