MySQL में एक को छोड़कर सभी कॉलम का चयन करें?




select (19)

मैं एक को छोड़कर एक निश्चित MySQL तालिका से सभी कॉलम प्राप्त करने के लिए एक चयन कथन का उपयोग करने का प्रयास कर रहा हूं। क्या ऐसा करने के लिए एक सरल तरीका है?

संपादित करें: इस तालिका में 53 कॉलम हैं (मेरा डिज़ाइन नहीं)


@ Mahomedalid के जवाब पर सहमत हैं। लेकिन मैं तैयार कथन की तरह कुछ नहीं करना चाहता था और मैं सभी क्षेत्रों को टाइप नहीं करना चाहता था। तो मेरे पास एक मूर्ख समाधान था। Phpmyadmin-> sql-> में तालिका में जाएं, चुनें, यह क्वेरी प्रतिलिपि को प्रतिस्थापित करता है और किया जाता है! :)


@ महोमेदीद उत्तर के आधार पर, मैंने "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;

यदि आपके पास बहुत सारे कोल हैं, तो group_concat_max_len को बदलने के लिए इस एसक्यूएल का उपयोग करें

SET @@group_concat_max_len = 2048;

Mahomedalid द्वारा पोस्ट उत्तर एक छोटी सी समस्या है:

फ़ंक्शन कोड को प्रतिस्थापित करने के अंदर " <columns_to_delete>, " को प्रतिस्थापित कर दिया गया था <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> और `को बदलना

हटाए गए कॉलम को मेरे मामले में "FIELD_REMOVED" स्ट्रिंग द्वारा प्रतिस्थापित किया गया है क्योंकि यह काम करता है क्योंकि मैं सुरक्षित स्मृति की कोशिश कर रहा था। (जिस क्षेत्र को मैं हटा रहा था वह लगभग 1 एमबी का बीएलओबी है)


MySQL परिभाषाओं (मैनुअल) में ऐसी कोई बात नहीं है। लेकिन अगर आपके पास कॉलम col1 की वास्तव में बड़ी संख्या है, ..., col100 , निम्नलिखित उपयोगी हो सकते हैं:

mysql> CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
mysql> ALTER TABLE temp_tb DROP col_x;
mysql> SELECT * FROM temp_tb;

आप DESCRIBE my_table का उपयोग कर सकते हैं और इसके परिणाम का उपयोग गतिशील रूप से SELECT कथन उत्पन्न करने के लिए कर सकते हैं।


क्या इस मामले में एक दृश्य बेहतर काम करेगा?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

जबकि मैं थॉमस के उत्तर (+1;) से सहमत हूं), मैं उस चेतावनी को जोड़ना चाहता हूं जिसे मैं उस कॉलम को मानूंगा जिसे आप नहीं चाहते हैं, शायद ही कोई डेटा हो। यदि इसमें टेक्स्ट, एक्सएमएल या बाइनरी ब्लब्स की भारी मात्रा है, तो प्रत्येक कॉलम को अलग-अलग चुनने के लिए समय लें। आपका प्रदर्शन अन्यथा भुगतना होगा। चीयर्स!


तुम कर सकते हो:

SELECT column1, column2, column4 FROM table WHERE whatever

कॉलम 3 प्राप्त किए बिना, हालांकि शायद आप एक सामान्य समाधान की तलाश में थे?


बस करो

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 से जवाब पसंद आया और इसके अलावा @Bill Karwin से टिप्पणी में सूचित किया गया। @Jan Koritak द्वारा उठाई गई संभावित समस्या सच है कि मुझे इसका सामना करना पड़ा लेकिन मुझे इसके लिए एक चाल मिली है और इस मुद्दे का सामना करने वाले किसी के लिए इसे यहां साझा करना चाहते हैं।

हम REPLACE फ़ंक्शन को प्रतिस्थापित कर सकते हैं जहां इस तरह के तैयार कथन की उप-क्वेरी में खंड है:

मेरी तालिका और कॉलम नाम का उपयोग करना

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 नहीं

उम्मीद है कि यह किसी को समाधान की तलाश में मदद करेगा।

सादर


मेरे सबसे अच्छे ज्ञान के लिए, नहीं है। आप कुछ ऐसा कर सकते हैं:

SELECT col1, col2, col3, col4 FROM tbl

और मैन्युअल रूप से इच्छित कॉलम चुनें। हालांकि, अगर आप बहुत सारे कॉलम चाहते हैं, तो आप बस ऐसा करना चाहते हैं:

SELECT * FROM tbl 

और केवल उस चीज़ को अनदेखा करें जिसे आप नहीं चाहते हैं।

आपके विशेष मामले में, मैं सुझाव दूंगा:

SELECT * FROM tbl

जब तक कि आप केवल कुछ कॉलम नहीं चाहते हैं। यदि आप केवल चार कॉलम चाहते हैं, तो:

SELECT col3, col6, col45, col 52 FROM tbl

ठीक होगा, लेकिन अगर आप 50 कॉलम चाहते हैं, तो कोई भी कोड जो क्वेरी बनाता है (भी?) पढ़ने में मुश्किल हो जाएगा।


मैं इस समस्या को हल करने के लिए एक और दृष्टिकोण जोड़ना चाहता हूं, विशेष रूप से यदि आपके पास हटाने के लिए कुछ कॉलम हैं।

आप अपने लिए चयन कथन उत्पन्न करने के लिए MySQL वर्कबेंच जैसे डीबी टूल का उपयोग कर सकते हैं, इसलिए आपको जेनरेट कथन के लिए मैन्युअल रूप से उन कॉलम को मैन्युअल रूप से निकालना होगा और इसे अपनी SQL स्क्रिप्ट पर कॉपी करना होगा।

MySQL वर्कबेंच में इसे उत्पन्न करने का तरीका यह है:

तालिका पर राइट क्लिक करें -> एसक्यूएल संपादक को भेजें -> सभी कथन चुनें।


मैं भी यह चाहता था इसलिए मैंने इसके बजाय एक समारोह बनाया।

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)."`";
    }
}

तो यह कैसे काम करता है कि आप तालिका में प्रवेश करते हैं, फिर एक कॉलम जिसे आप नहीं चाहते हैं या सरणी में: सरणी ("आईडी", "नाम", "जो भी कॉलम")

तो चयन में आप इसे इस तरह इस्तेमाल कर सकते हैं:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

या

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

मैं मानता हूं कि यह Select * लिए पर्याप्त नहीं है Select * , अगर आपको जिसकी आवश्यकता नहीं है, जैसा कि कहीं और बताया गया है, एक बीएलओबी है, तो आप उस ओवरहेड रेंगना नहीं चाहते हैं।

मैं आवश्यक डेटा के साथ एक दृश्य बनाउंगा, फिर आप आराम से Select * कर सकते हैं Select * अगर डेटाबेस सॉफ़्टवेयर उनका समर्थन करता है। अन्यथा, विशाल डेटा को किसी अन्य तालिका में रखें।


यदि आप एसक्यूएल उत्पन्न करते हैं और मूल्यांकन करते हैं तो आप SQL उत्पन्न करने के लिए SQL का उपयोग कर सकते हैं। यह एक सामान्य समाधान है क्योंकि यह सूचना स्कीमा से कॉलम नाम निकालता है। यूनिक्स कमांड लाइन से यहां एक उदाहरण दिया गया है।

स्थानापन्न

  • MYSQL आपके mysql कमांड के साथ
  • टेबल नाम के साथ टेबल
  • बहिष्कृत फ़ील्ड नाम के साथ EXCLUDEDFIELD
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 गए प्रश्नों में $column_list स्ट्रिंग का पुन: उपयोग कर सकते हैं।


यदि आप किसी फ़ील्ड के मान को बहिष्कृत करना चाहते हैं, उदाहरण के लिए सुरक्षा चिंताओं / संवेदनशील जानकारी के लिए, आप उस कॉलम को शून्य के रूप में पुनर्प्राप्त कर सकते हैं।

जैसे

SELECT *, NULL AS salary FROM users

यदि आप सभी कॉलम पूछते हैं तो भी कॉलम निर्दिष्ट करना अच्छा अभ्यास है।

तो मैं सुझाव दूंगा कि आप कथन में प्रत्येक कॉलम का नाम लिखें (जिसे आप नहीं चाहते हैं) को छोड़कर।

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

यदि यह हमेशा एक ही कॉलम होता है, तो आप एक ऐसा दृश्य बना सकते हैं जिसमें इसमें शामिल न हो।

अन्यथा, नहीं, मुझे ऐसा नहीं लगता है।


हो सकता है कि मेरे पास जन कोरितक की स्पष्ट विसंगति का समाधान हो

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'




select