본문 바로가기
MySql

MySQL을 사용하여 테이블의 여러 열 (하나의 문에서)에 값 일치

by 베이스 공부 2021. 1. 18.
반응형

다음 열을 포함하는 MySQL의 테이블을 사용하고 있습니다.

id, january, february, march, april, etc

테이블의 데이터는 다음과 같습니다.

aa, 0, 0, 1, 0
ab, 1, 0, 1, 0
ac, 1, 1, 0, 0
ad, 1, 1, 1, 0

쿼리하려면 다음과 같이 쉽게 할 수 있습니다.

select * from table where january = 1 and february = 1

결과는 다음과 같습니다.

ac, 1, 1, 0, 0
ad, 1, 1, 1, 0

다음과 같은 방법이 있는지 알고 싶습니다.

select * from table where table.columns = 1

실제로 이름을 수동으로 지정하지 않고 표현식에서 테이블 열을 사용하고 싶습니다 (입력).

보너스 (+1) 질문 :
다음과 같이 Match / Against를 사용하여 수행 할 수 있습니까?

select * from table
where
(
    match (somehow,get,the,table,columns,I,need,here)
    against (1 in boolean mode)
)

시간 내 줘서 고마워! :)

 

해결 방법

 

수행하려는 작업은 동적 SQL로만 수행 할 수 있으므로 Prepared Statement를 사용해야합니다.

SET @stmt = 'SELECT * FROM YOUR_TABLE WHERE 1 = 1 '
SET @stmt = CONCAT(@stmt, (SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
                            FROM INFORMATION_SCHEMA.COLUMNS
                           WHERE table_name = 'YOUR_TABLE'
                             AND table_schema = 'db_name'
                             AND column_name NOT IN ('id'))); 

PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

첫 번째 SET 문은 기본 SELECT 문을 구성합니다. "1 = 1"부분은 " AND column = 1 "을 더 쉽게 연결할 수 있도록합니다.

두 번째 SET 문은 쿼리의 내용을 연결하여 테이블 이름을 기반으로하는 열 목록을 첫 번째 SET 문의 문자열 끝에 가져옵니다. 아이디어는 다음과 같습니다.

SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_name = 'YOUR_TABLE'
   AND table_schema = 'db_name'
   AND column_name NOT IN ('id')

...는 " AND january = 1 AND february = 1 ... "과 유사한 행을 반환합니다. WHERE 절에 원하지 않는 다른 열이 있으면 NOT IN 절을 업데이트해야합니다.

나머지는 준비된 표준 명령문이며이 모든 작업은 저장 프로 시저 내에서 발생해야합니다.

 

참조 페이지 https://stackoverflow.com/questions/1372860

 

 

반응형

댓글