source

MySQL에서 하나를 제외한 모든 열을 선택하시겠습니까?

gigabyte 2022. 10. 2. 22:05
반응형

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 워크벤치와 쿼리 빌더를 사용하여 "토픽을 벗어났다"고 해도 사용합니다.

  1. 열 보기 열기
  2. Shift 쿼리에서 원하는 열을 모두 선택합니다(이 경우 한 열을 제외한 모든 열을 선택합니다).
  3. 오른쪽 버튼을 클릭하여 send to SQL Editor -> name short 를 선택합니다.
  4. 이제 목록이 표시되고 쿼리를 복사하여 원하는 위치에 붙여넣을 수 있습니다.

여기에 이미지 설명 입력

항상 동일한 열일 경우 해당 열이 없는 보기를 작성할 수 있습니다.

그렇지 않으면, 난 그렇게 생각하지 않아.

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

반응형