MySQL 쿼리에서 텍스트를 숫자로 변환


138

MySQL 쿼리 내에서 텍스트를 숫자로 변환 할 수 있습니까? 이름과 "이름-번호"형식의 숫자로 구성된 식별자가있는 열이 있습니다. 열에 VARCHAR 유형이 있습니다. 숫자 (같은 이름을 가진 행)에 따라 행을 정렬하고 싶지만 열은 문자 순서에 따라 정렬됩니다.

name-1
name-11
name-12
name-2

숫자를 잘라 내면 'varchar'숫자를 '실제'숫자로 변환하고이를 사용하여 행을 정렬 할 수 있습니까? 다음 순서로 입수하고 싶습니다.

name-1
name-2
name-11
name-12

숫자를 별도의 열로 나타낼 수 없습니다.

편집 2011-05-11 9:32

다음 해결책을 찾았습니다 ... ORDER BY column * 1. 이름에 숫자가 포함되어 있지 않으면 해당 솔루션을 사용하기 위해 저장됩니까?


1
이름 은 정확히 이름 이거나 어떤 문자 일 수 있습니까? 내 말은 : 문자열이 4 자 길이입니까, 아니면 실제 이름입니까?
Marco

name문자의 순서가 될 수 있습니다.
czuk

답변:


256

이것은 작동해야합니다 :

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1
설명서에 대한 설명과 링크를 추가 할 수 있습니까?
Angelo Fuchs

내 문자열은 "name-abc12"와 같습니다. 코드를 추가하면 "-"뒤의 초기 문자가 문자로 시작하지 않는 경우에만 작동합니다. @Marco 어디에 조건없이 문자를 무시할 수있는 방법을 말해 줄 수 있습니까?
Eduardo

1
@Eduardo 내 쿼리는 "-"뒤에 문자열을 가져 와서 숫자로 변환해야합니다 (숫자 여야 함). 당신의 경우에 나는 아마 정규 표현식을 사용하여 갈 것입니다 ...
Marco

@Marco 정규 표현식으로 팁을 주셔서 감사합니다.
Eduardo

32

당신은 사용할 수 있습니다 SUBSTRINGCONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

name_column"name-"값이있는 열은 어디에 있습니까 ? SUBSTRING제거합니다의 여섯 번째 문자 전에 모든 것을까지 (즉, "이름 -"접두사)와 그 다음 CONVERT변환은 진정한 정수로 남아.

업데이트 : 주석의 변화하는 환경을 고려할 때 (즉 접두사가 무엇이든 될 수 있음) LOCATE믹스 를 던져야합니다 .

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

이것은 물론 숫자가 아닌 접두어에 하이픈이 없다고 가정하지만 관련 의견은 다음과 같이 말합니다.

name 일련의 문자가 될 수 있습니다

안전한 가정이되어야합니다.


내 의견에 대답하면서 그는 name 이 어떤 문자 시퀀스라도 될 수 있다고 말 했으므로 사용할 수 있는지 잘 모르겠습니다 SUBSTRING(name_column, 6). 알다시피, 당신은 그가 우리에게 이것을 말하지 않았을 때 그것을 게시했습니다 ...
Marco

@Marco : 감사합니다. 접두사에 대한 새로운 정보를 처리해야하는 업데이트를 추가했습니다. 그러나 SUBSTRING_INDEX가 더 좋습니다.
mu는 너무 짧습니다.

23

단순히 CAST를 사용하십시오.

CAST(column_name AS UNSIGNED)

캐스트 결과의 유형은 다음 값 중 하나 일 수 있습니다.

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

14

CAST () 를 사용 하여 문자열을 int로 변환 할 수 있습니다 . 예 :SELECT CAST('123' AS INTEGER);


15
특정 버전입니까? 그것을 사용 SELECT CAST('123' AS SIGNED INTEGER);하거나 SELECT CAST('123' AS UNSIGNED INTEGER);작동 시켜야합니다 .
Hobo

10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1
ORDER BY가 CONVERT를 사용하지 않고 num을 숫자로 사용 하시겠습니까? 확실하지는 않지만 .. 그냥 물어 보는 것만으로 :)
Marco

4

간단한 방법으로 SELECT '123'+ 0


이 코드는 문제를 해결하는 데 도움이 될 수 있지만 , 질문 에 대한 이유 및 / 또는 방법 에 대한 추가 컨텍스트를 제공 하면 장기적인 가치가 크게 향상됩니다. 제발 편집 약간의 설명을 추가 할 답변을.
Toby Speight

이것은 질문에 대답하지 않았지만 내가 찾고있는 대답이었습니다.
Sagar Shah

귀하의 솔루션은 가장 우아하고 실용적입니다-불행히도 주어진 맥락에서 특정 표현으로 질문의 맥락에서 솔루션을 제공하지 않았습니다-구체적으로 수정하십시오.
chukko


2

기본 키가

ABC / EFG / EE / 13 / 123 (시퀀스 번호)와
같은 형식의 문자열 인 경우이 문자열을 구분 기호 ( "/")로 정렬하는 데 쉽게 사용할 수 있습니다.

다음 쿼리를 사용하여이 유형의 키가있는 테이블을 정렬 할 수 있습니다.

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC


-5

일반적인 방법 :

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.