Как исправить ошибку, при которой отрицательное значение передается ВЛЕВО()

#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. Многие «правила» почтового индекса Великобритании затем сводятся на нет целой кучей «исключений»!

Ответ №1:

isnull(nullif(patnidex(...) - 1, -1), 0)