우리는 결코 더 이상 숫자 순서 값으로 열거를 저장하지; 디버깅과 지원을 너무 어렵게 만듭니다. 문자열로 변환 된 실제 열거 값을 저장합니다.
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
다음으로 다시 읽어보십시오.
Suit theSuit = Suit.valueOf(reader["Suit"]);
문제는 과거에 Enterprise Manager를 쳐다보고 다음을 해독하려고했던 것입니다.
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
구절
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
후자는 훨씬 쉽습니다. 전자는 소스 코드에서 열거 형 멤버에 할당 된 숫자 값을 찾아야했습니다.
예, 더 많은 공간이 필요하지만 열거 형 멤버 이름이 짧고 하드 드라이브가 저렴하며 문제가있을 때 도움을주는 것이 훨씬 더 가치가 있습니다.
또한 숫자 값을 사용하면 그 값에 묶여 있습니다. 이전 숫자 값을 강제하지 않고 멤버를 멋지게 삽입하거나 재 배열 할 수 없습니다. 예를 들어 Suit 열거를 다음과 같이 변경합니다.
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
될 것입니다 :
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
데이터베이스에 저장된 레거시 숫자 값을 유지하기 위해.
데이터베이스에서 정렬하는 방법
질문이 나옵니다. 값을 주문하고 싶다고 가정 해 보겠습니다. 어떤 사람들은 열거 형의 서수 값으로 정렬하기를 원할 수 있습니다. 물론 열거 형의 숫자 값으로 카드를 주문하는 것은 의미가 없습니다.
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
그것은 우리가 원하는 순서가 아닙니다-우리는 그것들을 열거 순서로 원합니다 :
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
문자열을 저장하는 경우 정수 값을 저장하는 경우 필요한 동일한 작업이 필요합니다.
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
그러나 그것은 우리가 원하는 순서가 아닙니다. 우리는 그것들을 열거 순서로 원합니다.
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
내 의견은 이러한 종류의 순위가 사용자 인터페이스에 속한다는 것입니다. 열거 형 값을 기준으로 항목을 정렬하는 경우 : 뭔가 잘못하고있는 것입니다.
하지만 정말로 그렇게하고 싶다면 Suits
차원 테이블을 만들 것입니다 .
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
이렇게하면 Kissing Kings New Deck Order 를 사용하도록 카드를 변경하려는 경우 모든 데이터를 버리지 않고 표시 목적으로 변경할 수 있습니다.
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
이제 내부 프로그래밍 세부 정보 (열거 형 이름, 열거 형 값)를 사용자를위한 표시 설정으로 구분합니다.
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder