Как использовать substr для разделенных запятыми значений в таблице в SQLite - PullRequest
2 голосов
/ 15 сентября 2011

В моей базе данных в SQLITE есть таблица, в которой координаты x и y указаны в поле местоположения как (10,10). Я хочу использовать координату x и координату y отдельно, используя запрос выбора. Я знаю, что мы можем использовать subtr и charAtIndex для определения местоположения, но я не уверен, как это сделать? Я новичок в sqlite и мне нужна помощь, чтобы разобраться с этим.

Ответы [ 6 ]

2 голосов
/ 15 сентября 2011

Как уже отмечали другие, вы действительно должны поместить x и y в их собственные столбцы.

Вот способ получить x, если вы не можете этого сделать:

sqlite> select * from t;
10,10
(11,11)
(12,13)
sqlite> select rtrim(rtrim(ltrim(coord,'('),'0123456789)'),',')  from t;
10
11
12
sqlite> 

Получение y будет похоже.

1 голос
/ 15 сентября 2011

Строковые функции SQLite довольно ограничены, но вы используете неявные преобразования типов, чтобы разбить вашу строку.Что-то вроде этого должно сделать это:

select xy + 0 as x,
       substr(xy, length(xy + 0) + 2) as y
from some_table

Это должно работать, пока у вас нет начальных нулей или пробелов или внутренних пробелов.Добавление нуля превращает значение в число, поэтому '10,5' + 0 становится просто 10;затем вызов length для этого превращает его обратно в строку и дает вам длину строки, затем настройте ее, чтобы учесть изменение запятой (+1) и длины до смещения (+1), и вы получитеваши 5 из '10,5'.

Например:

sqlite> select '10,5' + 0 as x, substr('10,5', length('10,5' + 0) + 2) as y;
x|y
10|5

Тем не менее, вам действительно следует изменить дизайн схемы, чтобы иметь отдельные столбцы для координат X и Y, храня структурированные данные внутриодин столбец, как правило, плохая идея.


Обновление для комментариев : SQLite также позволит вам делать такие вещи:

select value,
       xy + 0 as x,
       substr(xy, length(xy + 0) + 2) as y
from some_table
where x < 2000
  and y < 2000

или даже:

select value
from some_table
where (xy + 0) < 2000
  and substr(xy, length(xy + 0) + 2) < 2000

Такие запросы в конечном итоге будут выполнять полное сканирование таблицы, поэтому они могут быть слишком медленными для вас.Исправление схемы, чтобы иметь отдельные столбцы координат X и Y OTOH даст вам быстрые запросы.

0 голосов
/ 02 августа 2016

Вы можете использовать функции json, если у вас есть расширение json1.Если ваши данные действительно (10, 10).Вы можете сделать

select
  json_extract(replace(replace(value, '(', '['), ')', ']'), '$[0]') as x,
  json_extract(replace(replace(value, '(', '['), ')', ']'), '$[1]') as y
from myTable
where x >= 10 AND y <= 10

Идея состоит в том, чтобы преобразовать ваши данные в действительный json и использовать функции json для работы.Вы можете найти больше функций в документации здесь: https://www.sqlite.org/json1.html

0 голосов
/ 15 сентября 2011

Функция SQLite substr на самом деле не пригодна для этого, и использование функций C substr немного "придирчиво".Проще всего преобразовать в NSString и использовать componentSeparatedByString или componentsSeparatedByCharactersInSet, чтобы вернуть вам простой простой NSArray отдельных значений, разделенных запятыми, без необходимости кодировать какую-либо итерацию.

[Но если вы хотите выбрать в этом полеу вас есть проблема - ни одна функция SQLite, о которой я знаю, не включит ее, кроме, возможно, «лайка», которую было бы очень неуклюже использовать.]

0 голосов
/ 15 сентября 2011

Я подозреваю ошибку в проектировании базы данных.Например: вы создаете таблицу для прямоугольника, тогда координаты должны быть отдельными атрибутами, а не хранить их вместе.Одна строка прямоугольника будет представлять один экземпляр прямоугольника, а их значения - координаты, длина, ширина и т. Д. Если вы спроектировали базу данных с таким великолепным дизайном, это будет действительно эффективно для операций.

0 голосов
/ 15 сентября 2011

Если вы можете каким-либо образом изменить свою схему, вам следует хранить координаты x и y в отдельных числовых полях.Это повысит производительность, поскольку вам не нужно будет выполнять какую-либо обработку подстроки и снизит сложность ваших запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...