Замена начальных нулей не работает без явного идентификатора - PullRequest
0 голосов
/ 14 сентября 2018
  • Я использую SQL Server 2012.

Я обновлял столбец с именем PostNumber в таблице, чтобы поставить ведущие нули.Тип данных: nvarchar (50).Это должно быть 6 цифр всегда.Если не шесть, он должен быть дополнен ведущими нулями.Я пытался со следующим T-SQL:

update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)

Исходная таблица1:

   Id   PostNumber
    1       234
    2      24545
    3     435434

Что нам нужно сделать:

    Id   PostNumber

    1      000234
    2      024545
    3      435434

Очень странноэто не работает с прежним T-SQL!Если мы явно не установим Id ..

update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)
where Id between 1 and 3

Последний T-SQL работает, но я не знаю , почему прежний T-SQL не работает !Таблица остается неизменной без установки нулей.Не могли бы вы указать возможную причину?Благодарю.Мне действительно нужно массовое обновление без явных идентификаторов.

1 Ответ

0 голосов
/ 14 сентября 2018

Фактическая проблема

Если столбец PostNumber имеет числовой тип, значение 123 будет таким же, как значение 000123.Начальные нули - это вопрос строковых типов или - в большинстве случаев то, что вам нужно только на уровне представления.

ОБНОВЛЕНИЕ Недостаточно внимательно прочитано ...

В комментарии вы заявили, чтостолбец имеет вид nvarchar(50)

Возможно, что вокруг ваших значений есть пробелы, попробуйте следующее:

set PostNumber=RIGHT('000000'+ISNULL(LTRIM(RTRIM(PostNumber)),''),6)

Проверьте с помощью

SELECT PostNumber,LEN(PostNumber),DATALENGTH(PostNumber) FROM ...

подходов заполнения

Есть несколько подходов, я предпочитаю один с REPLACE на STR

DECLARE @number INT=34;
SELECT REPLACE(STR(@number,6),' ','0')

Проблема с очень обычным подходом с RIGHT заключается в том, что он будетвозвращать неверный результат в случаях, когда число превышает количество цифр.

DECLARE @number6 INT=123456;
SELECT REPLACE(STR(@number6,6),' ','0')
      ,RIGHT('000000'+ISNULL(@number6,''),6);

DECLARE @number7 INT=1234567;
SELECT REPLACE(STR(@number7,6),' ','0')
      ,RIGHT('000000'+ISNULL(@number7,''),6);

Если честно: мой любимый подход имеет недостатки с отрицательными числами:

DECLARE @numberMinus INT=-15;
SELECT REPLACE(STR(@numberMinus,6),' ','0')
      ,RIGHT('000000'+ISNULL(@numberMinus,''),6);

Начиная с SQL-Server 2012 существует FORMAT()

SELECT FORMAT(@number,'000000')

Не самый лучший перфомер, но прекрасно работает.

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