Определить тип данных столбца в SQLite

Я работаю над приложением для Android, где у пользователя есть разные варианты сортировки отображаемых данных, поступающих из базы данных. В настоящее время моя строка orderBy, которую я передаю методу Androids query (), выглядит следующим образом:

"LOWER("+columnName+") ASC"

Проблема заключается в том, что если тип данных в столбце, заданном параметром columnName, является целым, вызов LOWER () для него приведет к сортировке по алфавиту, то есть на основе только самой левой цифры, что, конечно, не имеет никакого смысла. для числовых данных. Следовательно, я хочу применить LOWER () только в том случае, если тип данных столбца не является целым числом. Я имею в виду такое утверждение:

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

Часть в скобках - это то, что я не умею делать. Предоставляет ли SQLite функцию для определения типа данных столбца?


person Steven Meliopoulos    schedule 23.06.2010    source источник


Ответы (5)


Вам действительно нужен тип столбца или тип значения? (SQLite динамически типизирован, поэтому различие важно.)

Если вам нужно последнее, вы можете использовать typeof(columnName).

person dan04    schedule 23.06.2010
comment
В моем случае это не имеет значения. Тип значений должен соответствовать типу столбца. Итак, typeof (columnName) должен работать отлично. Большое тебе спасибо. - person Steven Meliopoulos; 24.06.2010
comment
@ dan04, какой бы синтаксис был? Например, могу ли я написать это так: имя_столбца ТЕКСТ НЕ ПРОВЕРКА (typeof (имя_столбца))? - person Lulu; 29.09.2018
comment
@Kourosh см. Мой опубликованный ответ. - person qwr; 23.10.2019

Использовать:

PRAGMA table_info(table-name);

чтобы получить информацию о таблице.

person Diego Torres Milano    schedule 23.06.2010

Взято непосредственно из документации SQLite о типах данных для SQLite версии 3:

Большинство механизмов баз данных SQL (насколько нам известно, все механизмы баз данных SQL, кроме SQLite) используют статическую жесткую типизацию. При статической типизации тип данных значения определяется его контейнером - конкретным столбцом, в котором хранится значение.

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
person qwr    schedule 23.10.2019

Вы объявили столбец как целое число при настройке таблицы? В противном случае sqlite сохранит его как текст, и сортировка будет действовать так, как вы описали.

create table if not exists exampletable (columnName integer);
person roundhill    schedule 23.06.2010
comment
Да, я объявил числовые столбцы целыми. И если я удалю вызов LOWER (), целочисленные столбцы будут отсортированы по желанию. Но, конечно, вызов LOWER () существует не просто так, потому что именно так я хочу, чтобы текстовые столбцы были отсортированы. - person Steven Meliopoulos; 24.06.2010

Чтобы получить информацию об использовании таблицы

PRAGMA table_info(table-name);

Если вы хотите последнее, вы можете использовать

typeof(columnName)
person Hedayat H    schedule 10.07.2021