MySQL 열거를 비교할 수 있습니까?
문제
나는 열거가있다 : ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
이 열로 테이블을 정렬하면 위에서 정의 된 올바른 순서로 얻습니다.
그러나 델타 이전의 모든 것, 즉 델타 이전의 하위 집합을 선택하는 방법을 찾을 수 없습니다. 사용 WHERE status < 'delta'
감마가 아닌 알파와 베타 만 반환합니다. MySQL은 열거 된 인덱스 비교가 아니라 문자열 비교를 사용하는 것 같습니다.
인덱스 번호를 사용할 수 있습니다 - 즉 WHERE status < 4
- 그러나 그것은 약간의 코드 냄새 (마법 숫자)이며, 열거에 새 값을 삽입하면 깨질 수 있습니다.
해결책
메타 데이터에서 데이터 조작 방법을 사용하려고 노력하고 있으며 이는 어색해야합니다.
이것이 바로 교체해야 할 좋은 이유입니다 ENUM
조회 테이블에 대한 외국 키가 있습니다. 그런 다음 기존 데이터 조작 기술을 사용할 수 있습니다.
다른 팁
당신이 사용할 수있는 status+0
1부터 시작하여 열거의 색인을 반환합니다.
나타내다 http://serghei.net/docs/database/mysql/doc/e/n/enum.html
방금 같은 문제를 발견했습니다. 열거 필드를 정렬하려면 먼저 문자열 유형으로 캐스팅해야합니다 (범주는 예에서 내 열거 필드입니다) :
SELECT
CONVERT(category USING utf8) as str_category
FROM
example
GROUP BY
str_category
ORDER BY
str_category
eazy!
당신이 사용할 수있는 FIELD(column, "string1", "string2", ...)
가능한 특정 하위 집합이있는 행을 찾습니다 ENUM
가치.
SELECT * FROM `table` WHERE FIELD(`enum_column`, "alpha", "delta", "et cetera");
범위 버전을 사용하려면 사용할 수 있습니다. FIND_IN_SET("needle", "hay,stack")
인덱스를 반환하려면 다른 쿼리와 함께 먼저 테이블 정의에서 열거 목록을 추출해야합니다.
함수 만들기 :
CREATE fEnumIndex(_table VARCHAR(50), _col VARCHAR(50), _val VARCHAR(50))
RETURNS INT DETERMINISTIC
BEGIN
DECLARE _lst VARCHAR(8192);
DECLARE _ndx INT;
SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND
TABLE_NAME=_table AND COLUMN_NAME=_col INTO _lst;
SET _ndx = FIND_IN_SET(_val, _lst);
RETURN _ndx;
END
그런 다음 다음과 같이 쿼리에서 사용하십시오.
SELECT * FROM MyTable WHERE Status < fEnumIndex('MyTable','Status','delta') ;
그만큼 SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
그것을 취할 것입니다 COLUMN_TYPE
~와 같은 ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
쉼표로 구분 된 목록으로 바꾸십시오. 'alpha, beta, gamma, delta, omega'
. 그럼 FIND_IN_SET(_val, _lst)
인덱스를 가져옵니다.
조심해야 할 유일한 것은 열거를 정의하는 방법 (항목 사이의 공간이 있거나없는)과 내부에서 REPLACE
(From_string의 공간이 있거나없는).