row_number registros numero length generar fila ejemplos ejemplo correlativo contador consecutivo sql tsql

sql - registros - varchar ejemplo



¿Cómo ordeno una columna VARCHAR en el servidor SQL que contiene números? (11)

Tengo una columna VARCHAR en una base de datos de SQL Server 2000 que puede contener letras o números. Depende de cómo se configura la aplicación en el front-end para el cliente.

Cuando contiene números, quiero que se clasifiquen numéricamente, por ejemplo, como "1", "2", "10" en lugar de "1", "10", "2". Los campos que contienen solo letras, o letras y números (como ''A1'') se pueden ordenar alfabéticamente de forma normal. Por ejemplo, esto sería un orden de clasificación aceptable.

1 2 10 A B B1

¿Cuál es la mejor manera de lograr esto?


Esta consulta es útil para usted. En esta consulta, una columna tiene un tipo de datos varchar ordenado por buen orden. Por ejemplo, en esta columna los datos son: - G1, G34, G10, G3. Entonces, después de ejecutar esta consulta, verá los resultados: - G1, G10, G3, G34.

SELECT *, (CASE WHEN ISNUMERIC(column_name) = 1 THEN 0 ELSE 1 END) IsNum FROM table_name ORDER BY IsNum, LEN(column_name), column_name;


Esto parece funcionar:

select your_column from your_table order by case when isnumeric(your_column) = 1 then your_column else 999999999 end, your_column


Esto puede ayudarte, lo he intentado cuando tengo el mismo problema.

SELECT * FROM tab ORDER BY IIF(TRY_CAST(val AS INT) IS NULL, 1, 0),TRY_CAST(val AS INT);


Hay algunas maneras posibles de hacer esto.

Uno sería

SELECT ... ORDER BY CASE WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value) ELSE 9999999 -- or something huge END, value

la primera parte de ORDER BY convierte todo en un int (con un gran valor para los no numéricos, para ordenar el último), luego la última parte se ocupa de los alfabetos.

Tenga en cuenta que el rendimiento de esta consulta probablemente sea al menos moderadamente espantoso en grandes cantidades de datos.


Lo resolví de una manera muy simple escribiendo esto en la parte de "orden"

ORDER BY ( sr.codice +0 ) ASC

Esto parece funcionar muy bien, de hecho tuve la siguiente clasificación:

16079 Customer X 016082 Customer Y 16413 Customer Z

Entonces, el 0 en frente de 16082 se considera correctamente.


Una posible solución es rellenar los valores numéricos con un carácter al frente para que todos tengan la misma longitud de cadena.

Aquí hay un ejemplo usando ese enfoque:

select MyColumn from MyTable order by case IsNumeric(MyColumn) when 1 then Replicate(''0'', 100 - Len(MyColumn)) + MyColumn else MyColumn end

El 100 debe reemplazarse con la longitud real de esa columna.


siempre puedes convertir tu varchar-column a bigint ya que un entero puede ser demasiado corto ...

select cast([yourvarchar] as BIGINT)

pero siempre debes cuidar a los personajes alfa

where ISNUMERIC([yourvarchar] +''e0'') = 1

el + ''e0'' proviene de http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/isnumeric-isint-isnumber

esto llevaría a su declaración

SELECT * FROM Table ORDER BY ISNUMERIC([yourvarchar] +''e0'') DESC , LEN([yourvarchar]) ASC

la primera columna de clasificación colocará un valor numérico en la parte superior. el segundo ordena por longitud, por lo que 10 precederá a 0001 (¿¡qué es estúpido !?)

esto lleva a la segunda versión:

SELECT * FROM Table ORDER BY ISNUMERIC([yourvarchar] +''e0'') DESC , RIGHT(''00000000000000000000''+[yourvarchar], 20) ASC

la segunda columna ahora se rellena correctamente con ''0'', por lo que la clasificación natural pone números enteros con ceros a la izquierda (0,01,10,0100 ...) en el orden correcto (¡correcto!) - pero todos los alfas se mejorarían con ''0'' -chars (rendimiento)

así que tercera versión:

SELECT * FROM Table ORDER BY ISNUMERIC([yourvarchar] +''e0'') DESC , CASE WHEN ISNUMERIC([yourvarchar] +''e0'') = 1 THEN RIGHT(''00000000000000000000'' + [yourvarchar], 20) ASC ELSE LTRIM(RTRIM([yourvarchar])) END ASC

ahora los números primero se rellenan con ''0''-chars (por supuesto, la longitud 20 podría mejorarse) -que ordena correctamente los números- y los alphas solo se recortan


SELECT *, ROW_NUMBER()OVER(ORDER BY CASE WHEN ISNUMERIC (ID)=1 THEN CONVERT(NUMERIC(20,2),SUBSTRING(Id, PATINDEX(''%[0-9]%'', Id), LEN(Id)))END DESC)Rn ---- numerical FROM ( SELECT ''1''Id UNION ALL SELECT ''25.20'' Id UNION ALL SELECT ''A115'' Id UNION ALL SELECT ''2541'' Id UNION ALL SELECT ''571.50'' Id UNION ALL SELECT ''67'' Id UNION ALL SELECT ''B48'' Id UNION ALL SELECT ''500'' Id UNION ALL SELECT ''147.54'' Id UNION ALL SELECT ''A-100'' Id )A ORDER BY CASE WHEN ISNUMERIC (ID)=0 /* alphabetical sort */ THEN CASE WHEN PATINDEX(''%[0-9]%'', Id)=0 THEN LEFT(Id,PATINDEX(''%[0-9]%'',Id)) ELSE LEFT(Id,PATINDEX(''%[0-9]%'',Id)-1) END END DESC


SELECT *, CONVERT(int, your_column) AS your_column_int FROM your_table ORDER BY your_column_int

O

SELECT *, CAST(your_column AS int) AS your_column_int FROM your_table ORDER BY your_column_int

Ambas son bastante portátiles, creo.


SELECT FIELD FROM TABLE ORDER BY isnumeric(FIELD) desc, CASE ISNUMERIC(test) WHEN 1 THEN CAST(CAST(test AS MONEY) AS INT) ELSE NULL END, FIELD

Según este enlace, debes enviar dinero a DINERO y luego a INT para evitar ordenar ''$'' como número.


select Field1, Field2... from Table1 order by isnumeric(Field1) desc, case when isnumeric(Field1) = 1 then cast(Field1 as int) else null end, Field1

Esto devolverá los valores en el orden que dio en su pregunta.

El rendimiento no será demasiado grande con todo ese proceso, por lo que otro enfoque es agregar otra columna a la tabla en la que almacene una copia entera de los datos y luego ordenarla por esa primera y luego por la columna en cuestión. Obviamente, esto requerirá algunos cambios en la lógica que inserta o actualiza datos en la tabla, para rellenar ambas columnas. O eso, o ponga un disparador en la tabla para completar la segunda columna siempre que se inserten o actualicen datos.