Целочисленное сравнение в виде строки - PullRequest
2 голосов
/ 24 марта 2010

У меня есть целочисленный столбец, и я хочу найти числа, которые начинаются с определенных цифр.

Например, они совпадают, если я ищу '123':

1234567
123456
1234

Они не совпадают:

23456
112345
0123445

Является ли единственный способ справиться с задачей путем преобразования целых чисел в строки перед выполнением сравнения строк?

Также я использую Postgre regexp_replace (текст, шаблон, замена) для чисел, что очень медленно и неэффективно.

Дело в том, что у меня есть большой объем данных для обработки таким образом, и я ищу наиболее экономичный способ сделать это.

PS. Я не ищу способ, как привести целое число в строку.

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

Вы ищете совпадение в начале значения? Вы можете создать функциональный индекс следующим образом:

CREATE INDEX my_index ON mytable(CAST(stuff AS TEXT));

Он должен использоваться вашим запросом LIKE, но я его не проверял.

2 голосов
/ 24 марта 2010

В качестве стандартного принципа (ИМХО) проект базы данных должен использовать числовой тип в том и только в том случае, если поле имеет вид:

  1. Число, на котором вы могли бы разумно выполнять математику
  2. Код ссылки в базе данных - ключи и т. Д.

Если это число в каком-то другом контексте - номера телефонов, IP-адреса и т. Д. - сохраните его в виде текста.

Мне кажется, что ваш '123' концептуально является строкой, которая, как оказалось, содержит только цифры, поэтому, если возможно, я бы предложил изменить дизайн, чтобы он сохранялся как таковой.

В противном случае, я не вижу разумного способа сделать сравнение, используя его в качестве чисел, поэтому вам нужно преобразовать его в строки на лету с помощью чего-то вроде

SELECT * FROM Table WHERE CheckVar LIKE '''' + to_char(<num>,'999') + '%'
2 голосов
/ 24 марта 2010

Лучший способ повысить производительность - сохранить их в виде строк с индексом для столбца и использовать LIKE «123%». Большинство других методов решения этой проблемы, вероятно, будут включать полное сканирование таблицы.

Если вам не разрешено менять таблицу, вы можете попробовать следующее, но это не очень красиво:

WHERE col = 123
   OR col BETWEEN 1230 AND 1239
   OR col BETWEEN 12300 AND 12399
   etc...

Это может также привести к сканированию таблицы. Вы можете решить, преобразовав OR в несколько вариантов выбора, а затем UNION ALL их, чтобы получить окончательный результат.

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