2010-04-04 14 views
6

Escenario:Servidor SQL Concatenar el valor de la columna de cadena a 5 caracteres de largo

Tengo una tabla1 (col1 char (5)); Un valor en la tabla 1 puede '001' o '01' o '1'.

Requisito:

Cualquiera que sea el valor de col1, necesito que retrive de longitud 5 Char concatenar con los principales '0' para que sea 5 Char larga.

aplica la Técnica I:

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

Yo no vi ninguna razón, ¿por qué no funciona? pero no fue así ¿Alguien puede ayudarme, cómo puedo lograr el resultado deseado?

Respuesta

12

Dado que está utilizando una columna de ancho fijo, ya es de tamaño 5 (con espacios en blanco). Es necesario recortarlo:

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 

O utilice varchar lugar:

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 
+0

Gracias Michael. – niceApp

+1

No hay problema. Aquí hay otro SQL Server que puedes encontrar, esta vez con columnas 'varchar': si no especificas una longitud, tienen el valor predeterminado de 30. http://stackoverflow.com/questions/359257/why-is-the- default-length-for-varchar-30-when-use-cast –

+0

+1 por no usar REPLICATE ;-) ejemplo: http://stackoverflow.com/questions/3151503/tsql-scalar-function-need-to-return -a-valor concatenado/3151781 # 3151781 – gbn

1

Si está almacenando los datos en un campo CHAR, probablemente esté consiguiendo espacios correctos en memoria intermedia con espacios en blanco. p.ej. 01 = "01". Si haces un DERECHO ("00000" + valor, 5), seguirá siendo el valor original. Necesita hacer un RTRIM() en el valor o almacenar los datos en un campo VARCHAR.

+0

Gracias Zachary – niceApp

0

El problema es que el campo char (5) tiene siempre 5 caracteres de longitud, sin importar lo que pongas en él. Si inserta '01' en el campo, el valor almacenado es en realidad '01       '(tenga en cuenta los espacios finales).

Prueba esto:

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

Editar: Dejaré mi respuesta aquí como un ejemplo, pero la respuesta de Michael usando rtrim es mejor.

0

necesita almacenar sus datos de una manera consistente, por lo que no es necesario escribir consultas para dar formato a los datos de cada uno hora. Esto solucionará los datos existentes:

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

ahora cada vez que se selecciona sólo tiene que hacer esto:

SELECT col1 FROM table1 

Sin embargo, debe asegurarse de que los datos tiene el formato correcto (ceros a la izquierda) cada Hora en que se inserta. Yo añadiría una restricción de comprobación para asegurarse:

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

y cuando inserto hace esto:

INSERT INTO table1 
     (col1, ... 
    VALUES 
     (RIGHT('00000'+ISNULL(RTRIM(@col1),''),5) 
Cuestiones relacionadas