mysql - ungleich - sql select alles außer




Wählen Sie alle Spalten außer einer in MySQL aus? (19)

Ich versuche, eine SELECT-Anweisung zu verwenden, um alle Spalten einer bestimmten MySQL-Tabelle außer einer zu erhalten. Gibt es einen einfachen Weg, dies zu tun?

Bearbeiten: Es gibt 53 Spalten in dieser Tabelle (nicht mein Design)


Basierend auf @Mahomedalid Antwort, habe ich einige Verbesserungen gemacht, um "alle Spalten außer einigen in mysql auszuwählen" zu unterstützen

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;

Wenn Sie viele Spalten haben, verwenden Sie diese SQL, um group_concat_max_len zu ändern

SET @@group_concat_max_len = 2048;

Beim Testen der Lösungen von @Mahomedalid und @Junaid habe ich ein Problem gefunden. Ich dachte daran, es zu teilen. Wenn der Spaltenname Leerzeichen oder Bindestriche wie das Einchecken enthält, schlägt die Abfrage fehl. Die einfache Problemumgehung besteht darin, einen Backtick um die Spaltennamen zu verwenden. Die modifizierte Abfrage ist unten

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;

Du kannst tun:

SELECT column1, column2, column4 FROM table WHERE whatever

ohne Spalte3 zu bekommen, obwohl Sie vielleicht nach einer allgemeineren Lösung gesucht haben?


Eigentlich gibt es einen Weg, du musst natürlich Berechtigungen dafür haben ...

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;

Ersetzen von <table>, <database> and <columns_to_omit>


Ich bin ziemlich spät dran, eine Antwort dafür zu finden, das ist die Art und Weise, wie ich es immer getan habe und ehrlich gesagt, es ist 100 Mal besser und ordentlicher als die beste Antwort, ich hoffe nur, dass jemand es sehen wird. Und finde es nützlich

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

Ich möchte einen weiteren Gesichtspunkt hinzufügen, um dieses Problem zu lösen, besonders wenn Sie eine kleine Anzahl von Spalten haben, die entfernt werden sollen.

Sie könnten ein DB-Tool wie MySQL Workbench verwenden, um die select-Anweisung für Sie zu generieren. Sie müssen diese Spalten also nur manuell für die generierte Anweisung entfernen und sie in Ihr SQL-Skript kopieren.

In MySQL Workbench ist der Weg, um es zu generieren:

Rechtsklick auf die Tabelle -> sende an Sql Editor -> Select All Statement.


Ich stimme der "einfachen" Lösung zu, alle Spalten aufzulisten, aber das kann mühsam sein, und Tippfehler können viel Zeit verschwenden. Ich benutze eine Funktion "getTableColumns", um die Namen meiner Spalten abzurufen, die zum Einfügen in eine Abfrage geeignet sind. Dann muss ich nur diejenigen löschen, die ich nicht möchte.

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 [email protected] 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;

Ihr Ergebnis gibt eine durch Kommas getrennte Zeichenfolge zurück, z. B. ...

Spalte1, Spalte2, Spalte3, Spalte4, ... Spalte53


Ich stimme zu, dass es nicht ausreicht, Select * zu Select * , wenn das, was du nicht benötigst, wie es an anderer Stelle erwähnt wird, ein BLOB ist, du willst nicht, dass dieser Overhead hineinkriecht.

Ich würde eine Ansicht mit den erforderlichen Daten erstellen, dann können Select * bequem Select * auswählen - wenn die Datenbanksoftware diese unterstützt. Else, legen Sie die riesigen Daten in eine andere Tabelle.


In mysql Definitionen (Handbuch) gibt es keine solche Sache. Aber wenn Sie eine wirklich große Anzahl von Spalten col1 , ..., col100 , kann Folgendes nützlich sein:

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

Ja, obwohl es je nach Tabelle hohe E / A-Werte geben kann, habe ich einen Workaround gefunden, den ich dafür gefunden habe.

Select *
into #temp
from table

alter table #temp drop column column_name

Select *
from #temp

Mein Hauptproblem sind die vielen Spalten, die ich bekomme, wenn ich Tabellen verbinde. Dies ist zwar nicht die Antwort auf Ihre Frage (wie alle bis auf bestimmte Spalten aus einer Tabelle ausgewählt werden), aber ich denke, es ist erwähnenswert, dass Sie eine table. angeben können table. um alle Spalten aus einer bestimmten Tabelle zu erhalten, anstatt nur anzugeben.

Hier ist ein Beispiel, wie dies sehr nützlich sein könnte:

select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode

from users

left join user_meta as phone
on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') )

left join user_meta as zipcode
on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') )

Das Ergebnis sind alle Spalten aus der Benutzertabelle und zwei zusätzliche Spalten, die aus der Metatabelle zusammengesetzt wurden.


Sie können SQL verwenden, um SQL zu generieren, wenn Sie das von ihm erzeugte SQL mögen und auswerten. Dies ist eine allgemeine Lösung, da die Spaltennamen aus dem Informationsschema extrahiert werden. Hier ist ein Beispiel aus der Unix-Befehlszeile.

Substituierend

  • MYSQL mit Ihrem mysql-Befehl
  • TABLE mit dem Tabellennamen
  • EXCLUSIONFIELD mit ausgeschlossenem Feldnamen
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

Sie müssen die Spaltennamen nur auf diese Weise nur einmal extrahieren, um die Spaltenliste zu erstellen, die diese Spalte ausschließt, und dann einfach die von Ihnen erstellte Abfrage verwenden.

So etwas wie:

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)

Jetzt können Sie die $column_list Zeichenfolge in von Ihnen erstellten Abfragen wiederverwenden.


Soweit ich weiß, gibt es das nicht. Sie können etwas tun wie:

SELECT col1, col2, col3, col4 FROM tbl

und wählen Sie manuell die gewünschten Spalten aus. Wenn Sie jedoch viele Spalten haben möchten, können Sie einfach Folgendes tun:

SELECT * FROM tbl 

und ignoriere einfach, was du nicht willst.

In Ihrem speziellen Fall würde ich vorschlagen:

SELECT * FROM tbl

es sei denn, du willst nur ein paar Spalten. Wenn Sie nur vier Spalten möchten, dann:

SELECT col3, col6, col45, col 52 FROM tbl

wäre in Ordnung, aber wenn Sie 50 Spalten wollen, dann würde jeder Code, der die Abfrage macht, (zu?) schwer zu lesen sein.


Vereinbaren Sie @ Mahomedalids Antwort. Aber ich wollte so etwas wie eine vorbereitete Aussage nicht machen und wollte nicht alle Felder eingeben. Was ich hatte, war eine dumme Lösung. Gehe zur Tabelle in phpmyadmin-> sql-> auswählen, es wird die Abfrage Kopie ersetzen und fertig! :)


Während ich der Antwort von Thomas (+1;) zustimme, möchte ich den Vorbehalt hinzufügen, dass ich annehmen werde, dass die Spalte, die Sie nicht haben möchten, kaum Daten enthält. Wenn es enorme Mengen an Text-, XML- oder Binär-Blobs enthält, nehmen Sie sich die Zeit, um jede Spalte einzeln auszuwählen. Ihre Leistung wird sonst leiden. Prost!


Würde eine View in diesem Fall besser funktionieren?

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

Wenn die Spalte, die Sie nicht auswählen wollten, eine große Menge an Daten enthielt und Sie diese aufgrund von Geschwindigkeitsproblemen nicht einschließen wollten, und Sie die anderen Spalten häufig auswählen, würde ich vorschlagen, dass Sie eine neue Tabelle erstellen mit dem einen Feld, das Sie normalerweise nicht mit einem Schlüssel zur ursprünglichen Tabelle auswählen und entfernen Sie das Feld von der ursprünglichen Tabelle. Verknüpfen Sie die Tabellen, wenn dieses zusätzliche Feld tatsächlich benötigt wird.


Wenn es immer dieselbe Spalte ist, können Sie eine Ansicht erstellen, in der sie nicht enthalten ist.

Ansonsten, nein, ich denke nicht.


Vielleicht habe ich eine Lösung für Jan Koritaks Diskrepanz

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' );

Tabelle :

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

====================================

Abfrageergebnis:

'SELECT name_eid,sal FROM employee'




select