Перейти к содержимому


Выбрать шаблон и создать сайт

  • Закрытая тема Тема закрыта

Поиск по части текстового поля в числовом диапозоне

#1 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0
0

Отправлено 11 Июль 2010 - 01:31

Как можно вытаскивать данные из БД с помощью регулярных выражений?

Есть поле в БД примерно такого содержания

316-A3446-10


при запросе необходимо вытащить данные, которые задаются диапазоном.

То есть интересует в данном выражении только часть после буквы А и до дефиса.

Например от 3446 до 3489. Запрос должен вытащить все варианты, в которых данная часть входит в данный диапазон, а остальная часть строки может быть какой угодно, но количество символов и тип их не изменяется. Кроме буквы А. Иногда вместо А может быть ОС.

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 12 Июль 2010 - 17:43

gaaarfild, вряд ли здесь потянет REGEXP он не умеет задавать диапазон чисел, он умеет искать в строке последовательности.
Вот тебе кустарный метод, работает xD
SELECT
*
FROM test
WHERE SUBSTRING_INDEX(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
SUBSTRING_INDEX(articul,'-',2),
'-',-1),
'OC',-1),
'A',-1)+0 BETWEEN 3446 AND 3489

  • 0

#3 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Июль 2010 - 16:37

Это так клево!!! =) Хоть объясни чуток! =)

И, кстати, можно еще сделать так, чтобы часть после второго дефиса тоже можно было задать? Всегда двухзначное.
Это год.
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 15 Июль 2010 - 07:42

gaaarfild, ладно :angry:

В условии я столбец данных привожу к нужному нам виду, а именно оставляю те цифры, которые ты просил. Конструкция кода, который ты привёл позволяет это сделать. А так же слова: "Иногда вместо А может быть ОС."

Теперь о запросе:
1) Запрос, как мы видим, обычный, вытаскиваем все поля из таблицы test с условием.
2) В условии я сравниваю целевое число преобразованное из строки, проверяю, попадает ли оно в диапазон.
3) Функция SUBSTRING_INDEX(str, delim, N) - возвращает подстроку строки str. Если параметр N имеет положительное значение, то SUBSTRING_INDEX() находит N-ое вхождение (отсчет слева) подстроки delim в строке str и возвращает всю часть строки, расположенную слева от подстроки delim. Если N имеет отрицательное значение, то находится N-ое вхождение (отсчет справа) подстроки delim в строке str и возвращается часть строки, расположенная справа от подстроки delim
4) Мне пришлось сделать аж 4 вложения данной функции, чтобы убрать всё лишнее.

Так что я:
1) Изначально - 316-A3446-10
2) Нахожу второй дефис "-" слева и возвращаю всю часть левее второго дефиса, то есть - 316-A3446
3) Нахожу первый дефис "-" справа и возвращаю всю часть правее этого дефиса, то есть - A3446
4) Далее я двумя вложениями удаляю также A и OC
5) Прибавляя к строке, в котрой находится число, 0 - я получаю число.

И, кстати, можно еще сделать так, чтобы часть после второго дефиса тоже можно было задать? Всегда двухзначное.
Это год.

Возможно, всё возможно. Делай это вторым условием через AND, так же вырезай, но тут получится либо без вложений, либо с одним вложением :)
  • 0

#5 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 15 Июль 2010 - 20:12

Преогромнейшее спасибо. =)
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 16 Июль 2010 - 13:30

gaaarfild, всегда рад помочь :angry: Тему можно закрывать?
  • 0

#7 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 16 Июль 2010 - 15:56

Да. =)
  • 0


Оформление форума – IPBSkins.ru