sqlite高级区分大小写查询

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

我在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 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,这可能是一个解决方案。坦克!嗨,丹,这可能是个解决办法。坦克!