MySQL에서 하나를 제외한 모든 열을 선택하시겠습니까?
select 문을 사용하여 하나를 제외한 특정 MySQL 테이블의 모든 열을 가져오려고 합니다.간단한 방법이 있을까요?
편집: 이 테이블에는 53개의 열이 있습니다(MY DESIGN 이외).
실제로 방법이 있습니다.이 작업을 수행하려면 물론 허가를 받아야 합니다.
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
<고객명>의 치환<table>, <database> and <columns_to_omit>
(큰 테이블에서 시도하지 마십시오.결과는 다음과 같습니다.깜짝이야!)
임시 테이블
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_a, DROP col_f,DROP col_z; #// MySQL
SELECT * FROM temp_tb;
DROP 구문은 데이터베이스 @Denis Rozhnev에 따라 다를 수 있습니다.
이 경우 뷰가 더 잘 작동합니까?
CREATE VIEW vwTable
as
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
다음 작업을 수행할 수 있습니다.
SELECT column1, column2, column4 FROM table WHERE whatever
column3을 얻지 못한 채, 더 일반적인 솔루션을 찾고 있었을 수도 있습니다.
예를 들어 보안 문제/중요 정보에 대한 필드 값을 제외하려는 경우 해당 열을 null로 검색할 수 있습니다.
예.
SELECT *, NULL AS salary FROM users
내가 아는 한, 거기에는 없다.다음과 같은 작업을 수행할 수 있습니다.
SELECT col1, col2, col3, col4 FROM tbl
원하는 열을 수동으로 선택합니다.그러나 열이 많이 필요한 경우 다음 작업을 수행할 수 있습니다.
SELECT * FROM tbl
그리고 네가 원하지 않는 건 무시해.
당신의 경우, 저는 다음과 같이 제안합니다.
SELECT * FROM tbl
몇 개의 열만 원하는 경우를 제외하고요.4개의 열만 원하는 경우:
SELECT col3, col6, col45, col 52 FROM tbl
괜찮지만 50개의 컬럼을 원하는 경우 쿼리를 만드는 코드가 읽기 어려워집니다.
@Mahomedalid와 @Junaid의 솔루션을 시험하다가 문제를 발견했습니다.그래서 나눠먹으려고 했어요.열 이름에 체크인과 같은 공백 또는 하이픈이 있는 경우 쿼리는 실패합니다.간단한 해결 방법은 열 이름 주위에 backtick을 사용하는 것입니다.수정된 쿼리는 다음과 같습니다.
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
선택하지 않으려는 열에 대량의 데이터가 포함되어 있고 속도 문제로 인해 포함하지 않고 다른 열을 자주 선택하는 경우에는 원래 테이블의 키로 선택하지 않는 필드를 사용하여 새 테이블을 만들고 원래 테이블에서 필드를 삭제하는 것이 좋습니다.추가 필드가 실제로 필요한 경우 테이블을 결합합니다.
DESCRIPT my_table을 사용하여 그 결과를 사용하여 SELECT 문을 동적으로 생성할 수 있습니다.
나의 주된 문제는 테이블을 결합할 때 많은 컬럼이 생긴다는 것이다.이것은 질문에 대한 답변은 아니지만(한 테이블에서 특정 열을 제외한 모든 열을 선택하는 방법) 언급할 가치가 있다고 생각합니다.table.
를 지정하기만 하는 것이 아니라 특정 테이블에서 모든 열을 가져옵니다.
이것이 매우 도움이 되는 예를 다음에 나타냅니다.
users.*, phone.value를 전화, 우편번호로 선택합니다.우편번호로서의 meta_value 사용자로부터 user_module을 전화기로서 왼쪽 참여on (users.user_id = phone.user_id) AND (phone.user_key = 'phone') 왼쪽 join user_module을 우편번호on(users.user_id = zipcode.user_id) AND(zipcode).meta_key = 'zipcode' )
결과는 사용자 테이블의 모든 열과 메타 테이블에서 조인된 두 개의 추가 열입니다.
요.@Mahomedalid
을 이이에서 것 @Bill Karwin
에 의해 될 수 @Jan Koritak
저도 그 점에 직면했지만, 그 점에 대한 요령을 찾아냈기 때문에, 이 문제에 직면하고 있는 모든 분들을 위해 여기서 그것을 공유하고 싶습니다.
Replace 함수는 다음과 같이 Prepared 스테이트먼트의 서브쿼리에 있는 where 절로 대체할 수 있습니다.
내 테이블 및 열 이름 사용
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
이번에는 하겠습니다.id
아니다company_id
예, 테이블에 따라서는 I/O가 높을 수 있지만, 여기에서는 해결 방법을 찾았습니다.
SELECT *
INTO #temp
FROM table
ALTER TABLE #temp DROP COlUMN column_name
SELECT *
FROM #temp
모든 열을 조회하는 경우에도 조회할 열을 지정하는 것이 좋습니다.
그래서 각 열의 이름을 명세서에 쓰는 것을 추천합니다(불필요한 것을 제외).
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
모든 열을 나열하는 "간단한" 해결책에 동의하지만, 이는 부담스럽고 오타가 많은 시간을 낭비할 수 있습니다."getTableColumns" 함수를 사용하여 쿼리에 붙여넣기에 적합한 열의 이름을 가져옵니다.그럼 내가 해야 할 일은 내가 원하지 않는 것들을 삭제하는 거야.
CREATE FUNCTION `getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
결과는 쉼표로 구분된 문자열을 반환합니다. 예를 들어...
col1, col2, col3, col4, ... col53
합니다.Select *
다른 곳에서 언급했듯이, 당신이 필요하지 않은 것이 BLOB라면, 당신은 그 오버헤드가 슬금슬금 들어가는 것을 원하지 않을 것이다.
필요한 데이터를 사용하여 뷰를 만들 수 있습니다.Select *
데이터베이스 소프트웨어가 지원하는 경우 안심하고 편하게 사용할 수 있습니다.그렇지 않으면 대용량 데이터를 다른 테이블에 넣습니다.
처음에는 정규 표현을 사용할 수 있다고 생각했지만, MYSQL 문서를 읽고 보니 사용할 수 없는 것 같습니다.저라면 다른 언어(PHP 등)를 사용하여 원하는 컬럼 목록을 생성하고 문자열로 저장한 후 SQL을 생성할 것입니다.
@Mahomedalid 답변을 바탕으로 "select all columns in mysql"을 지원하기 위해 몇 가지 개선 사항을 수행했습니다.
SET @database = 'database_name';
SET @tablename = 'table_name';
SET @cols2delete = 'col1,col2,col3';
SET @sql = CONCAT(
'SELECT ',
(
SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
),
' FROM ',
@tablename);
SELECT @sql;
콜이 많은 경우 이 SQL을 사용하여 group_concat_max_len을 변경합니다.
SET @@group_concat_max_len = 2048;
@Mahomedalid의 답변에 동의하지만, 준비된 성명서 같은 것을 하고 싶지도 않고 모든 필드를 타이핑하고 싶지도 않았기 때문에 제가 가지고 있던 것은 어리석은 해결책이었습니다.
phpmyadmin->sql->select 테이블로 이동하면 쿼리가 덤프됩니다.copy, replace, done! : )
Thomas의 답변(+1;)에는 동의하지만, 당신이 원하지 않는 컬럼에는 데이터가 거의 없다고 가정할 수 있다는 경고를 추가하고 싶습니다.대량의 텍스트, xml 또는 바이너리 블럽이 포함되어 있는 경우는, 시간을 들여 각 열을 개별적으로 선택합니다.그렇지 않으면 성능이 저하될 것입니다.건배!
그냥 해
SELECT * FROM table WHERE whatever
그런 다음 좋아하는 프로그래밍 언어로 컬럼을 놓습니다: php
while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
unset($data["id"]);
foreach ($data as $k => $v) {
echo"$v,";
}
}
Mahomedalid가 게시한 답변에는 작은 문제가 있습니다.
는 "치환 기능 코드"를하고 있었습니다.<columns_to_delete>,
마지막 필드에 쉼표 "가 없기 때문에 이 대체는 콘캣 문자열의 마지막 필드에 쉼표 "가 없고 문자열에서 삭제되지 않은 경우 문제가 있습니다.
제안:
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
'<columns_to_delete>', '\'FIELD_REMOVED\'')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table>'
AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
<고객명>의 치환<table>
,<database>
displicate" 입니다.
이 경우 삭제한 열은 "FILD_REMOVED" 문자열로 대체됩니다.메모리를 보호하려고 했기 때문입니다.(삭제하고 있는 필드는 약 1MB의 BLOB입니다.
저도 이걸 원했기 때문에 대신 기능을 만들었습니다.
public function getColsExcept($table,$remove){
$res =mysql_query("SHOW COLUMNS FROM $table");
while($arr = mysql_fetch_assoc($res)){
$cols[] = $arr['Field'];
}
if(is_array($remove)){
$newCols = array_diff($cols,$remove);
return "`".implode("`,`",$newCols)."`";
}else{
$length = count($cols);
for($i=0;$i<$length;$i++){
if($cols[$i] == $remove)
unset($cols[$i]);
}
return "`".implode("`,`",$cols)."`";
}
}
따라서 테이블 입력 후 불필요한 컬럼 또는 배열과 같은 컬럼을 입력합니다.array("id","name","whattercolumn")
따라서 셀렉트에서는 다음과 같이 사용할 수 있습니다.
mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");
또는
mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
Jan Koritak의 지적된 불일치에 대한 해결책을 알고 싶습니다.
SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
SELECT CASE
WHEN COLUMN_NAME = 'eid' THEN NULL
ELSE COLUMN_NAME
END AS col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );
표:
SELECT table_name,column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
================================
table_name column_name
employee eid
employee name_eid
employee sal
================================
쿼리 결과:
'SELECT name_eid,sal FROM employee'
이 작업은 mysql 워크벤치와 쿼리 빌더를 사용하여 "토픽을 벗어났다"고 해도 사용합니다.
- 열 보기 열기
- Shift 쿼리에서 원하는 열을 모두 선택합니다(이 경우 한 열을 제외한 모든 열을 선택합니다).
- 오른쪽 버튼을 클릭하여 send to SQL Editor -> name short 를 선택합니다.
- 이제 목록이 표시되고 쿼리를 복사하여 원하는 위치에 붙여넣을 수 있습니다.
항상 동일한 열일 경우 해당 열이 없는 보기를 작성할 수 있습니다.
그렇지 않으면, 난 그렇게 생각하지 않아.
SQL이 생성하는 SQL을 평가하고 마음에 들면 SQL을 사용하여 SQL을 생성할 수 있습니다.이것은 정보 스키마에서 열 이름을 추출하는 일반적인 솔루션입니다.다음은 Unix 명령줄의 예입니다.
대체
- mysql 명령어를 사용한MYSQL
- 테이블 이름이 있는 테이블
- 제외 필드 이름이 있는 제외 필드
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL
이 방법으로 열 이름을 추출하여 해당 열을 제외한 열 목록을 작성한 후 작성한 쿼리를 사용하면 됩니다.
예를 들어 다음과 같습니다.
column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)
'우리'를 할 수 있게 되었습니다.$column_list
스트링을 지정합니다.
이 문제를 해결하기 위해 특히 제거할 열이 적은 경우 다른 관점을 추가하고 싶습니다.
MySQL Workbench와 같은 DB 도구를 사용하여 select 문을 생성할 수 있으므로 생성된 문의 열을 수동으로 제거하고 SQL 스크립트에 복사하기만 하면 됩니다.
MySQL Workbench에서 생성하는 방법은 다음과 같습니다.
테이블 우클릭 -> Send to SQL Editor -> Select All Statement 를 선택합니다.
받아들여진 답변에는 몇 가지 단점이 있다.
- 테이블 또는 열 이름에 백틱이 필요한 경우 실패합니다.
- 생략할 열이 목록의 마지막인 경우 실패합니다.
- 테이블 이름을 두 번(선택 텍스트와 쿼리 텍스트에 대해 하나씩) 나열해야 합니다. 중복되어 불필요합니다.
- 열 이름을 잘못된 순서로 반환할 수 있습니다.
할 수 .SEPARATOR
★★★★★★★★★★★★★★★★★★에GROUP_CONCAT
을 합니다.WHERE
" " 가 "REPLACE()
제 목적상(다른 많은 항목도 생각할 수 있습니다) 테이블 자체에 나타나는 순서대로 컬럼 이름을 반환하고 싶었습니다.위해서 을 사용합니다.ORDER BY
「 」의 GROUP_CONCAT()
★★★★
SELECT CONCAT(
'SELECT `',
GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
'` FROM `',
`TABLE_SCHEMA`,
'`.`',
TABLE_NAME,
'`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
AND `TABLE_NAME` = 'my_table'
AND `COLUMN_NAME` != 'column_to_omit';
나는 제안은 있지만 해결책은 없다.일부 열에 더 큰 데이터 세트가 있는 경우 다음과 같이 시도해야 합니다.
SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table
하여 MySQL Workbench를 클릭합니다.Send to sql editor
그리고 나서.Select All Statement
이렇게 하면 다음과 같이 모든 필드가 나열된 문이 생성됩니다.
SELECT `purchase_history`.`id`,
`purchase_history`.`user_id`,
`purchase_history`.`deleted_at`
FROM `fs_normal_run_2`.`purchase_history`;
SELECT * FROM fs_normal_run_2.purchase_history;
이제 당신은 당신이 원하지 않는 것들을 제거할 수 있습니다.
언급URL : https://stackoverflow.com/questions/9122/select-all-columns-except-one-in-mysql
'source' 카테고리의 다른 글
이유, 치명적인 오류: 클래스 'PHPUnit_Framework_'Test Case를 찾을 수 없습니다. (0) | 2022.10.02 |
---|---|
정규화된 UTF-8이란 무엇입니까? (0) | 2022.10.02 |
matplotlib Python 설치 문제 (0) | 2022.10.02 |
캔버스 요소에서 마우스 클릭 좌표를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.02 |
MySQL의 JSON에는 BLOB 또는 텍스트를 사용해야 합니까? (0) | 2022.10.02 |