#sql #sql-server
Вопрос:
Следующее предназначено для извлечения первых символов из строки. В данном случае извлечение области из почтового индекса. Поскольку область может быть переменной длины (1 или 2 символа), правило состоит в том, чтобы получить первые альфа-символы перед числами в первой половине строки (разделенные пробелом).
Если строка отформатирована правильно, работает следующее. Однако, если строка искажена (как показано ниже), PATINDEX возвращает 0, что, в свою очередь, приводит к тому, что -1 передается обратно родительскому ЛЕВОМУ().
Как я могу уловить отрицательное значение и заменить -1 на 0?
Пороки развития могут иметь формат: «ABO 12BT», «AB012BT» и т. Д.
DECLARE @Postcode nVARCHAR (10) = 'ab124th'
(
SELECT
RTRIM
(
LEFT
(
LEFT
(
@Postcode, CHARINDEX(' ', @Postcode)
),
(
PATINDEX
(
'%[0-9]%',
LEFT
(
@Postcode,
CHARINDEX(' ', @Postcode)
)
) -1
)
)
)
)
Комментарии:
1.
isnull(nullif(..., -1), 0)
?2. Вот и все! Пожалуйста, отправьте в качестве ответа, чтобы я принял его. С уважением.
3. Просто любопытно, почему это так сложно сделать, ища место? Разве чего-то подобного
RTRIM(LEFT(@Postcode, 2))
не было бы достаточно?4. Нет, потому что почтовые индексы Великобритании по своей сути сложно разделить на компоненты. Вот несколько примеров кодов городов : ‘SW1W 0NY’ = ‘SW’, ‘L1 8JQ’ = ‘L’, ‘PO16 7GZ’ = ‘PO’, и есть некоторые действительно неприятные устаревшие коды и «странные» коды. Система эволюционировала и следует некоторым довольно разрозненным правилам. en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom
5. Многие «правила» почтового индекса Великобритании затем сводятся на нет целой кучей «исключений»!