SQL Server объединяет строковое значение столбца длиной до 5 символов - PullRequest
6 голосов
/ 04 апреля 2010

Сценарий:

У меня есть таблица 1 (col1 char (5)); Значение в таблице1 может быть «001» или «01» или «1».

Требования:

Каким бы ни было значение в столбце col1, мне нужно извлечь его из конкатенации длиной 5 символов с лидирующим '0', чтобы сделать его длиной 5 символов.

Техника, которую я применил:

select right(('00000' + col1),5) from table1; 

Я не видел никакой причины, почему это не работает? но это не так. Кто-нибудь может мне помочь, как мне достичь желаемого результата?

Ответы [ 4 ]

12 голосов
/ 04 апреля 2010

Поскольку вы используете столбец с фиксированной шириной, он уже имеет размер 5 (с пробелами). Вы должны урезать это:

DECLARE @table1 TABLE (col1 char(5))

INSERT INTO @table1 (col1) VALUES ('12345')
INSERT INTO @table1 (col1) VALUES ('1')

SELECT RIGHT('00000'+RTRIM(col1),5) FROM @table1

-- Output:
-- 12345
-- 00001

Или используйте varchar вместо:

DECLARE @table2 TABLE (col1 varchar(5))

INSERT INTO @table2 (col1) VALUES ('12345')
INSERT INTO @table2 (col1) VALUES ('1')

SELECT RIGHT('00000'+col1,5) FROM @table2

-- Output:
-- 12345
-- 00001
1 голос
/ 04 апреля 2010

Если вы храните данные в поле CHAR, вы, вероятно, получаете правильные пробелы с буферизацией. например 01 = "01". Если вы делаете ПРАВО («00000» + значение, 5), оно все равно будет исходным значением. Вам необходимо выполнить RTRIM () для значения или сохранить данные в поле VARCHAR.

0 голосов
/ 05 апреля 2010

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

UPDATE table1
    SET col1= RIGHT('00000'+ISNULL(RTRIM(col1),''),5)

теперь каждый раз, когда вы выбираете, вам нужно только сделать это:

SELECT col1 FROM table1

однако вы должны убедиться, что данные форматируются правильно (начальные нули) при каждой вставке. Я бы добавил проверочное ограничение, чтобы убедиться:

ALTER TABLE table1 ADD CONSTRAINT
    CK_table1_col1 CHECK (LEN(col1)=5)

и при вставке сделайте это:

INSERT INTO table1
        (col1, ...
    VALUES
        (RIGHT('00000'+ISNULL(RTRIM(@col1),''),5)
0 голосов
/ 04 апреля 2010

Проблема в том, что поле char (5) всегда имеет длину 5 символов, независимо от того, что вы в него вставляете. Если вы вставите «01» в поле, то сохраненное значение будет фактически «01» (обратите внимание на конечные пробелы).

Попробуйте это:

select right(('00000' + replace(col1, ' ', '')), 5)

Редактировать: я оставлю здесь свой ответ в качестве примера, но ответ Майкла с использованием rtrim лучше.

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