[SQL] 어떻게 분류 번호가 포함 SQL 서버에 VARCHAR 컬럼을합니까?
SQL어떻게 분류 번호가 포함 SQL 서버에 VARCHAR 컬럼을합니까?
나는 문자 또는 숫자 중 하나를 포함 할 수있는 SQL Server 2000 데이터베이스에서 VARCHAR 컬럼이 있습니다. 이 응용 프로그램은 고객의 프런트 엔드에 구성하는 방법에 따라 달라집니다.
이 숫자를 포함 않을 때, 나는 그것이 예를 들어, 숫자 정렬하려면 "1", "2", "10"대신에 "1", "10"로, "2". (예 : 'A1'과 같은) 단지 문자를 포함하는 필드, 또는 문자와 숫자가 정상으로 알파벳 순으로 정렬 할 수 있습니다. 예를 들어,이 수용 가능한 정렬 순서 일 것이다.
1
2
10
A
B
B1
이를 달성하는 가장 좋은 방법은 무엇입니까?
해결법
-
==============================
1.모두 동일한 문자열의 길이가되도록 하나의 가능한 해결책은 패드 앞의 문자와 숫자 값이다.
모두 동일한 문자열의 길이가되도록 하나의 가능한 해결책은 패드 앞의 문자와 숫자 값이다.
여기서 그 방법을 사용한 예이다 :
select MyColumn from MyTable order by case IsNumeric(MyColumn) when 1 then Replicate('0', 100 - Len(MyColumn)) + MyColumn else MyColumn end
100은 그 컬럼의 실제 길이로 대체되어야한다.
-
==============================
2.이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.
이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.
하나는 것
SELECT ... ORDER BY CASE WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value) ELSE 9999999 -- or something huge END, value
(일종의 마지막에 비 수치에 대한 큰 값)를 int로 변환 모든 것을 BY 주문의 첫 번째 부분은 마지막 부분은 영문자을 담당한다.
참고이 쿼리의 성능이 적당히 무시 무시한 대량의 데이터에 적어도 아마입니다.
-
==============================
3.
SELECT *, CONVERT(int, your_column) AS your_column_int FROM your_table ORDER BY your_column_int
또는
SELECT *, CAST(your_column AS int) AS your_column_int FROM your_table ORDER BY your_column_int
둘 다 내가 생각하는 상당히 휴대용입니다.
-
==============================
4.
select Field1, Field2... from Table1 order by isnumeric(Field1) desc, case when isnumeric(Field1) = 1 then cast(Field1 as int) else null end, Field1
이것은 당신이 당신의 질문에이 순서대로 값을 반환합니다.
또 다른 방법은 당신이 문제의 그 다음, 제 1 및 열을 기준으로 정렬 한 후 데이터의 정수 사본을 저장하고있는 테이블에 다른 열을 추가하는 것입니다 수 있도록 성능, 캐스팅 진행하는 모든 너무 큰되지 않습니다. 이것은 분명히 테이블에 삽입 또는 업데이트 데이터가 모두 열을 채울 수 있다는 논리에 약간의 변화가 필요합니다. 그 중 하나는 나 데이터가 삽입되거나 업데이트 될 때마다 두 번째 열을 채우는 테이블에 트리거를 넣어.
-
==============================
5.나는 "순서"부분에이 글을 쓰는 아주 간단한 방법으로 해결
나는 "순서"부분에이 글을 쓰는 아주 간단한 방법으로 해결
ORDER BY ( sr.codice +0 ) ASC
이 사실 내가 정렬 다음을했다, 아주 잘 작동하는 것 같다 :
16079 Customer X 016082 Customer Y 16413 Customer Z
그래서 16082의 앞의 0이 제대로 간주됩니다.
-
==============================
6.정수가 너무 짧은 수 있습니다 당신은 항상 BIGINT에 VARCHAR 열을 변환 할 수 있습니다 ...
정수가 너무 짧은 수 있습니다 당신은 항상 BIGINT에 VARCHAR 열을 변환 할 수 있습니다 ...
select cast([yourvarchar] as BIGINT)
하지만 당신은 항상 알파 문자에 관심을 가져야
where ISNUMERIC([yourvarchar] +'e0') = 1
의 + 'E0'는 http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/isnumeric-isint-isnumber에서 온다
이 명세서로 이어질 것
SELECT * FROM Table ORDER BY ISNUMERIC([yourvarchar] +'e0') DESC , LEN([yourvarchar]) ASC
첫 번째 정렬 열은 상단에 숫자 둘 것이다. 길이에 의해 제 2 종류가 있으므로 10 의지 (어느 것이 바보!) 0001보다 선행
두 번째 버전이 리드 :
SELECT * FROM Table ORDER BY ISNUMERIC([yourvarchar] +'e0') DESC , RIGHT('00000000000000000000'+[yourvarchar], 20) ASC
(! 올바른) 두 번째 열은 이제 올바른 순서 앞에 0 (0,01,10,0100 ...)와 '0', 그래서 자연 정렬 풋 정수로 바로 패딩을 얻는다 - 그러나 모든 알파 '0'으로 향상 될 것입니다 -chars (성능)
그래서 세 번째 버전 :
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
단지 손질 취득 및 알파 - 바로 숫자를 정렬 - 지금 번호는 첫 번째 문자 0' (물론, 길이 (20)가 향상 될 수있다) '패딩 얻을
-
==============================
7.이것은 작동하는 것 같다 :
이것은 작동하는 것 같다 :
select your_column from your_table order by case when isnumeric(your_column) = 1 then your_column else 999999999 end, your_column
-
==============================
8.
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
이 링크 당로서 당신은 INT 다음 숫자로 피할 주문 '$'돈에 캐스트 할 필요가있다.
-
==============================
9.이 쿼리는 당신을 위해 도움이됩니다. 이러한 질의에서, 열은 데이터 varchar 형 좋은으로 배치되어 보유 order.For 예 - 데이터는이 칼럼 - G1, G34, G10, G3. 그래서,이 쿼리를 실행 한 후, 당신은 결과를 볼 : - G1, G10, G3, G34을.
이 쿼리는 당신을 위해 도움이됩니다. 이러한 질의에서, 열은 데이터 varchar 형 좋은으로 배치되어 보유 order.For 예 - 데이터는이 칼럼 - G1, G34, G10, G3. 그래서,이 쿼리를 실행 한 후, 당신은 결과를 볼 : - 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;
-
==============================
10.저도 같은 문제를 가지고 때 당신을 도울 수있다, 나는이 시도했다.
저도 같은 문제를 가지고 때 당신을 도울 수있다, 나는이 시도했다.
고르다 * 탭에서 ORDER BY IIF, TRY_CAST (브로 AS INT) (TRY_CAST (브로 AS INT)은 NULL, 1 0,);
-
==============================
11.
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
from https://stackoverflow.com/questions/119730/how-do-i-sort-a-varchar-column-in-sql-server-that-contains-numbers by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 에서 LIKE 연산자 대소 문자를 구분 MSSQL 서버와인가? (0) | 2020.04.24 |
---|---|
[SQL] MySQL을 열거 형 데이터 유형으로 SQL 서버에 해당? (0) | 2020.04.24 |
[SQL] SQL Server의 DD / MMM / YYYY 형식으로 변환 날짜 형식 (0) | 2020.04.24 |
[SQL] 구분 기호와 저장 프로 시저 구문을 만들 MYSQL (0) | 2020.04.24 |
[SQL] IN 연산자를 사용하는 변수를 정의 (T-SQL) (0) | 2020.04.24 |