Выбирать только числовую часть строки, только если она начинается с числового значения

#sql #regex #postgresql #conditional

#sql #регулярное выражение #postgresql #условные операторы

Вопрос:

Это дает мне только последний символ (числовой), но мне нужна вся числовая строка

 SELECT substring('123 Main Street' FROM '%#"[0-9]#"%' FOR '#')
  
  • Результаты: 3
  • Ожидается: 123

Это дает мне те же результаты, но мне нужно, чтобы оно возвращало пустое значение:

 SELECT substring('Main 123 Street' FROM '%#"[0-9]#"%' FOR '#')
  
  • Результаты: 3
  • Ожидая:

ПРИМЕЧАНИЕ: Postgres 7.4

Полезная ссылка: http://www.postgresql.org/docs/7.4/static/functions-matching.html

Обновить:

 SELECT substring('Main 123 Street' FROM '[0-9] ')
SELECT substring('123 Main Street' FROM '[0-9] ')
  
  • Оба теперь возвращают: 123
  • Все еще нужно пропустить или вернуть полную строку: ‘Main 123 Street’

ОБНОВЛЕНИЕ 2:

Почти получилось:

Это дает мне желаемые результаты, если они не начинаются с числового значения:

 SELECT 
    COALESCE(substring('Main 123 Street' FROM '[0-9]*') || 'Main 123 Street', ''),
    substring('Main 123 Street' FROM '[0-9]*')
  

Но это дает мне оба, и я хочу только второе условие:

 SELECT 
    COALESCE(substring('123 Main Street' FROM '[0-9]*') || '123 Main Street', ''),
    substring('123 Main Street' FROM '[0-9]*')
  

Я ПОНЯЛ!!! Спасибо всем, кто опубликовал:

 SELECT CASE
    WHEN COALESCE(substring(db_column FROM '[0-9]*'), db_column) != '' THEN COALESCE(substring(db_column FROM '[0-9]*'), db_column)
    ELSE db_column
END AS addsress_string
FROM db_table
  

Комментарии:

1. Это для сортировки буквенно-цифровых значений, которые начинаются с цифр?

2. нет, я хочу вернуть частичный адрес, если он начинается с числового значения, иначе полный адрес

Ответ №1:

Я не знаю синтаксис регулярных выражений postgresql, но в большинстве регулярных выражений вы бы написали [0-9] . Без квантора [0-9] соответствует одному символу.

Комментарии:

1. Хм, приведи меня к другому синтаксису, 1

Ответ №2:

У меня нет установки Postgres для тестирования, но что-то вроде этого может сработать:

SELECT substring('123 Main Street' FROM '^[0-9] ')

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

SELECT substring('123 Main Street' FROM '^[0-9] |.*')

Комментарии:

1. одно поле для обоих условий в одном запросе?

Ответ №3:

Возможно, еще не слишком поздно улучшить ответ rmmh.

Это работает для меня:

 SELECT substring(column_name FROM '[0-9] ') FROM TableName;
  

В postgresql просто удалите курсор, чтобы отображались числа.

если column_name = 'XXXX-0001' результат будет:

 0001