我正在使用Android应用程序,用户可以使用不同的选项对数据库中显示的数据进行排序。目前我传递给Androids query()方法的orderBy字符串如下所示:
"LOWER("+columnName+") ASC"
这个问题是,如果columnName指定的列中的数据类型是整数,则在其上调用LOWER()将导致它按字母顺序排序,即仅基于最左边的数字,当然这不是对数字数据有任何意义。因此,如果列的数据类型不是整数,我只想应用LOWER()。我想到的是这样的陈述:
"CASE WHEN [data type of columnName is integer] THEN "+columnName+" ASC ELSE LOWER("+columName+") ASC END"
括号中的部分是我不知道该怎么做的。 SQLite是否提供了确定列数据类型的函数?
答案 0 :(得分:12)
您真的想要列的类型,还是值的类型? (SQLite is dynamically-typed,所以区别很重要。)
如果您想要后者,可以使用typeof(columnName)
。
答案 1 :(得分:7)
使用:
PRAGMA table_info(table-name);
获取表信息。
答案 2 :(得分:1)
直接从SQLite docs about datatypes 获取(对于SQLite版本3):
大多数SQL数据库引擎(据我们所知,除SQLite以外的所有SQL数据库引擎)都使用静态的刚性类型。对于静态类型,值的数据类型由其容器(存储值的特定列)确定。
SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身(而不是其容器)相关联。 SQLite的动态类型系统与其他数据库引擎的更常见的静态类型系统向后兼容,因为在静态类型的数据库上运行的SQL语句应在SQLite中以相同的方式运行。但是,SQLite中的动态类型允许它执行传统的严格类型数据库中无法做到的事情。
列关联性:使用PRAGMA table_info(table-name);
。 PRAGMA table_info()
给出了一个包含列cid
,name
,type
,notnull
,dflt_value
和pk
的表格。
结果集中的列包括列名称,数据类型,该列是否可以为NULL以及该列的默认值。对于不属于主键的列,结果集中的“ pk”列为零,对于属于主键的列,该列的索引为主键中列的索引。
值的数据类型:使用typeof(column)
查看SQLite如何实际存储值。
示例摘自第3.4节:
CREATE TABLE t1(
t TEXT, -- text affinity by rule 2
nu NUMERIC, -- numeric affinity by rule 5
i INTEGER, -- integer affinity by rule 1
r REAL, -- real affinity by rule 4
no BLOB -- no affinity by rule 3
);
-- Values stored as TEXT, INTEGER, INTEGER, REAL, TEXT.
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
-- Values stored as TEXT, INTEGER, INTEGER, REAL, REAL.
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
-- Values stored as TEXT, INTEGER, INTEGER, REAL, INTEGER.
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
-- BLOBs are always stored as BLOBs regardless of column affinity.
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
-- NULLs are also unaffected by affinity
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
PRAGMA table_info(t1);
的输出:
0|t|TEXT|0||0
1|nu|NUMERIC|0||0
2|i|INTEGER|0||0
3|r|REAL|0||0
4|no|BLOB|0||0
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
的输出(请注意,列中的每个值都有其自己的数据类型):
text|integer|integer|real|text
text|integer|integer|real|real
text|integer|integer|real|integer
blob|blob|blob|blob|blob
null|null|null|null|null
答案 3 :(得分:0)
在设置表时,您是否将列声明为整数?否则,sqlite会将其存储为文本,并且排序将按照您的描述进行操作。
create table if not exists exampletable (columnName integer);
答案 4 :(得分:0)
获取Table使用信息
PRAGMA table_info(table-name);
如果你想要后者,你可以使用
typeof(columnName)