确定SQLite中列的数据类型

Ste*_*los 8 sqlite android types case

我正在开发一个Android应用程序,用户可以使用不同的选项来排序来自数据库的显示数据.目前我传递给Androids query()方法的orderBy字符串如下所示:

"LOWER("+columnName+") ASC"
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,如果columnName指定的列中的数据类型是整数,则在其上调用LOWER()将使其按字母顺序排序,即仅基于最左边的数字,这当然没有任何意义对于数字数据.因此,如果列的数据类型不是整数,我只想应用LOWER().我的想法是这样的声明:

"CASE WHEN [data type of columnName is integer] THEN "+columnName+" ASC ELSE LOWER("+columName+") ASC END"
Run Code Online (Sandbox Code Playgroud)

括号中的部分是我不知道该怎么做的.SQLite是否提供了确定列数据类型的函数?

dan*_*n04 12

您真的想要的类型或的类型吗?(SQLite是动态类型的,因此区别很重要.)

如果你想要后者,你可以使用typeof(columnName).


Die*_*ano 9

使用:

PRAGMA table_info(table-name);
Run Code Online (Sandbox Code Playgroud)

获取表格信息.


qwr*_*qwr 5

直接取自有关SQLite 版本 3数据类型的 SQLite 文档

大多数 SQL 数据库引擎(据我们所知,除了 SQLite 之外的每个 SQL 数据库引擎)都使用静态、严格的类型。对于静态类型,值的数据类型由其容器(存储值的特定列)决定。

SQLite 使用更通用的动态类型系统。在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。SQLite 的动态类型系统向后兼容其他数据库引擎的更常见的静态类型系统,因为在静态类型数据库上运行的 SQL 语句在 SQLite 中应该以相同的方式运行。然而,SQLite 中的动态类型允许它做传统严格类型数据库中不可能完成的事情。

柱亲和力:使用PRAGMA table_info(table-name);PRAGMA table_info()给出一个包含列cidnametypenotnulldflt_value和 的表pk.

结果集中的列包括列名、数据类型、列是否可以为 NULL 以及列的默认值。对于不属于主键的列,结果集中的“pk”列为零;对于属于主键的列,“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);
Run Code Online (Sandbox Code Playgroud)

输出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
Run Code Online (Sandbox Code Playgroud)

输出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
Run Code Online (Sandbox Code Playgroud)