2009-05-29 4 views
13

목표는 SQL 쿼리에서 반환되는 정수 값을 숫자가 나타내는 char 값으로 바꿉니다. 예를 들면 다음과 같습니다.SQL select 정수로 문자열 바꾸기

'스포츠'라는 테이블 속성은 1-4 사이의 정수 값으로 정의됩니다. 1 = Basketball, 2 = Hockey, etc. 아래는 데이터베이스 테이블과 원하는 결과입니다.

데이터베이스 테이블 :

Player  Team  Sport 
-------------------------- 
Bob  Blue  1 
Roy  Red  3 
Sarah  Pink  4 

는 출력을 원하는 :

Player  Team  Sport 
------------------------------ 
Bob  Blue  Basketball 
Roy  Red  Soccer 
Sarah  Pink  Kickball 

문자열 값이 정수 값을 변환하는 가장 좋은 방법은 무엇입니까? SQL을 사용하여 프로그램에 전달하기 전에 값을 변환 하시겠습니까? 스크립트 언어를 사용하여 프로그램 내에서 가치를 바꿀 수 있습니까? 데이터베이스 디자인을 변경 하시겠습니까?

답변

16

데이터베이스에 값이 있어야하며 그 데이터가 들어있는 다른 테이블에 대한 조인을 수행해야합니다.

그래서 당신은 사람들의 목록

ID 이름 FavSport
1 알렉스 4
2 모기

2 그리고 목록이 다음 다른 테이블 말을하는 테이블이 있어야합니다 스포츠의

ID 스포츠
1 농구
2 축구
3 축구
4는이 테이블 간의 조인 할 것입니다 그리고

킥볼이

select people.name, sports.sport 
from people, sports 
where people.favsport = sports.ID 

당신에게 돌려 줄 것

이름 스포츠
Alex Kickball
Gnat Football

예를 들어 사례문을 사용할 수도 있습니다. 위의 사람들 테이블을 사용하면 다음과 같이 쓸 수 있습니다.

select name, 
     case 
     when favsport = 1 then 'Basketball' 
     when favsport = 2 then 'Football' 
     when favsport = 3 then 'Soccer' 
     else 'Kickball' 
     end as "Sport" 
from people 

그러나 이는 분명히 모범 사례가 아닙니다.

+1

좋은 소리입니다. 불행히도이 프로젝트에서는 데이터베이스를 설계하거나 변경하는 기능을 제공받지 못했습니다. 그래서 저는 성명서와 함께해야 할 수도 있습니다. 그러나 조인 테이블은 완전한 의미를가집니다. 사실 PHP로 비슷한 일을하고 있었고, 속성 이름과 값을 전달한 함수를 만들었습니다. 그런 다음 어떤 문자열이 어떤 값과 일치하는지 찾기 위해 만든 인덱스 배열을 검사했습니다. 그래서 본질적으로 같은 것. 귀하의 회신에 감사드립니다. – Cimplicity

+0

영구 테이블을 만들 필요가 없습니다. 가장 좋지만 DBMS에 따라 다른 대안이 있습니다. 임시 테이블, 공통 테이블 식, 테이블 값 생성자. –

2

CASE 표현이 도움이 될 수 있습니다. 그러나, int로 기본 키와 작은 테이블과 name 문자열과 같은

1 baseball 
2 football 

등 및 JOIN 그것을 적절하게 쿼리를 가지고 더 빨리 할 수있다.

8

MySQL에는 CASE 문이 있습니다. 다음은 SQL Server에서 작동합니다.

SELECT 
    CASE MyColumnName 
     WHEN 1 THEN 'First' 
     WHEN 2 THEN 'Second' 
     WHEN 3 THEN 'Third' 
     ELSE 'Other' 
    END 
+0

예. 그러나 JOIN은 여전히 ​​선호 될 수 있습니다 (벤치 마크는 반드시 필요합니다 ;-). –

+0

네, 그렇습니다. 그러나 실제로는 올바른 접근법이 아닙니다. –

1

이러한 관계를 데이터베이스 자체의 정수와 문자열 사이에 저장하면 도움이 될 것이라고 생각하십니까? 이러한 관계를 저장해야하는 한 코드에서 잃어 버릴 수있는 것이 아니라 데이터베이스에 데이터를 저장하는 것이 좋습니다. 이 솔루션을 사용하면 정수가 다른 테이블의 값에 대한 외래 키가됩니다. 정수를 다른 테이블, 예를 들어 sportssport_idsport으로 저장하고 쿼리의 일부로 합치십시오.

SELECT * FROM my_table 대신 SELECT * from my_table을 사용하고 appropriate join을 사용하십시오. 기본 열의 모든 행에 해당하는 스포츠가없는 경우 왼쪽 조인을 사용할 수 있습니다. 그렇지 않으면 두 테이블에서 선택하고 where 절에 =를 사용하면됩니다.

1

확실히 DB에 문자열 값을 보유하게하십시오. 나는 DB 전문가가 아니지만 문자열과 해당 정수 값을 보유하는 테이블을 만드는 것이 좋습니다. 여기에서 두 테이블 간의 관계를 정의한 다음 select에서 JOIN을 수행하여 정수의 문자열 버전을 가져올 수 있습니다.

남자, 늦었습니다. 그런데 조인의 다른 유형을 읽어야합니다. 이것은 가장 간단한 조인의 예입니다.

3

oracle에서 DECODE 기능을 사용하면 데이터베이스 디자인이 사용자의 제어 범위를 벗어나는 솔루션을 제공 할 수 있습니다. 오라클 documentation에서 직접

enter image description here

:

예 :이 예 warehouse_id 값을 디코딩한다. warehouse_id가 1이면 함수는 'Southlake'를 리턴합니다. warehouse_id가 2이면 'San Francisco'를 반환합니다. 기타 등등. warehouse_id가 1, 2, 3 또는 4가 아니면 함수는 'Non domestic'을 리턴합니다.

SELECT product_id, 
     DECODE (warehouse_id, 1, 'Southlake', 
          2, 'San Francisco', 
          3, 'New Jersey', 
          4, 'Seattle', 
           'Non domestic') "Location" 
    FROM inventories 
    WHERE product_id < 1775 
    ORDER BY product_id, "Location";