MySQL - исключение строк из SELECT [дубликат]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

304
задан Tom Grochowicz 7 July 2011 в 15:08
поделиться

26 ответов

На самом деле существует какой-то способ: для этого вам необходимы разрешения ...

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>

190
ответ дан haim770 31 August 2018 в 23:34
поделиться

Насколько мне известно, нет. Вы можете сделать что-то вроде:

SELECT col1, col2, col3, col4 FROM tbl

и вручную выбрать нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто хотеть сделать:

SELECT * FROM tbl 

и просто игнорировать то, что вы не хотите.

В вашем конкретном случае , Я бы предложил:

SELECT * FROM tbl

, если вы не хотите только нескольких столбцов. Если вам нужны только четыре столбца, то:

SELECT col3, col6, col45, col 52 FROM tbl

будет в порядке, но если вы хотите 50 столбцов, то любой код, который делает запрос, станет (тоже?) Трудночитаемым.

23
ответ дан Arion 31 August 2018 в 23:34
поделиться

Возможно, у меня есть решение, которое я указал на расхождение Ян Коритак

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'
2
ответ дан Bhavik Shah 31 August 2018 в 23:34
поделиться

Будет ли просмотр лучше работать в этом случае?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table
39
ответ дан Brian Childress 31 August 2018 в 23:34
поделиться

Моя основная проблема - это много столбцов, которые я получаю при соединении таблиц. Хотя это не ответ на ваш вопрос (как выбрать все, кроме определенных столбцов из таблицы one ), я думаю, стоит упомянуть, что вы можете указать table., чтобы получить все столбцы из определенной таблицы , а не просто указать .

Вот пример того, как это может быть очень полезно:

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

Результатом являются все столбцы из таблицы users и два дополнительных столбца, которые были соединены с мета таблица.

6
ответ дан cwd 31 August 2018 в 23:34
поделиться

Я согласен с «простым» решением перечислить все столбцы, но это может быть обременительным, и опечатки могут вызвать много потерянного времени. Я использую функцию 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

< / BLOCKQUOTE>
4
ответ дан David Poor 31 August 2018 в 23:34
поделиться
1
ответ дан Gareth Simpson 31 August 2018 в 23:34
поделиться

Я хотел бы добавить еще одну точку зрения для решения этой проблемы, особенно если у вас есть небольшое количество столбцов для удаления.

Вы можете использовать инструмент DB, например MySQL Workbench , чтобы сгенерировать оператор select для вас, поэтому вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в ваш SQL-скрипт.

В MySQL Workbench способ его создания is:

Щелкните правой кнопкой мыши по таблице -> отправьте в редактор Sql -> Выбрать все заявление.

1
ответ дан H. Paúl Cervera García 31 August 2018 в 23:34
поделиться

Основываясь на ответе @Mahomedalid, я сделал некоторые улучшения для поддержки «выберите все столбцы, кроме некоторых в 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;
2
ответ дан hahakubile 31 August 2018 в 23:34
поделиться

Выбрать * - это антиспам SQL. Он не должен использоваться в производственном коде по многим причинам, включая:

Для обработки требуется немного больше времени. Когда дела идут миллионы раз, эти крошечные биты могут иметь значение. Медленная база данных, где медленность вызвана этим типом неаккуратного кодирования, является самым сложным способом настройки производительности.

Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает как узкие места в сети, так и сети. Если у вас есть внутреннее соединение, вероятность отправки большего количества данных, чем вам нужно, составляет 100%.

Это вызывает проблемы технического обслуживания, особенно когда вы добавили новые столбцы, которые вы не видите везде. Кроме того, если у вас есть новый столбец, вам может понадобиться что-то сделать для интерфейса, чтобы определить, что делать с этим столбцом.

Он может разбивать представления (я знаю, что это верно на сервере SQl, это может быть или не быть истинным в mysql).

Если кто-то достаточно глуп, чтобы перестроить таблицы со столбцами в порядке differnt (который вы не должны делать, но это происходит все время), всевозможные коды могут сломаться. Например, код для вставки, например, когда вы помещаете город в поле address_3 becasue без указания, база данных может идти только по порядку столбцов. Это довольно плохо, когда типы данных меняются, но хуже, когда обменные столбцы имеют один и тот же тип данных, потому что вы можете пойти на то, чтобы вставлять плохие данные, которые являются беспорядком для очистки. Вам нужно заботиться о целостности данных.

Если он используется во вставке, он сломает вставку, если новый столбец будет добавлен в одну таблицу, а не другую.

Он может сломать триггеры. Проблемы с триггером могут быть трудно диагностировать.

Добавьте все это против времени, необходимого для добавления в именах столбцов (черт возьми, вы даже можете иметь интерфейс, который позволяет перетаскивать имена столбцов (я знаю, что я делаю в SQL Server, d есть какой-то способ сделать это - это какой-то инструмент, который вы используете для написания запросов mysql.) Давайте посмотрим: «Я могу вызвать проблемы с обслуживанием, я могу вызвать проблемы с производительностью, и я могу вызвать проблемы с целостностью данных, но эй, я сохранил пять минут dev time. "Действительно просто введите конкретные столбцы, которые вы хотите.

Я также предлагаю вам прочитать эту книгу: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic- ? Программисты-книга / дп / B00A376BB2 / исх = sr_1_1 s = цифровой текст и усилитель, то есть = UTF8 & амп; QID = 1389896688 & амп; ср = 1-1 & амп; ключевые слова = SQL + antipatterns

-5
ответ дан HLGEM 31 August 2018 в 23:34
поделиться

Сначала я думал, что вы можете использовать регулярные выражения, но поскольку я читал документы MYSQL , похоже, вы не можете. Если бы я был вами, я бы использовал другой язык (например, PHP) для создания списка столбцов, который вы хотите получить, сохраните его как строку, а затем используйте для генерации SQL.

3
ответ дан icco 31 August 2018 в 23:34
поделиться

Вы можете использовать DESCRIBE my_table и использовать результаты этого для генерации инструкции SELECT динамически.

9
ответ дан jammycakes 31 August 2018 в 23:34
поделиться

Мне понравился ответ из @Mahomedalid, кроме этого факта, сообщенного в комментарии от @Bill Karwin. Возможная проблема, поднятая @Jan Koritak, верна. Я столкнулся с этим, но я нашел для этого трюк и просто хочу поделиться ею здесь, для тех, кто сталкивается с проблемой.

мы можем заменить функцию REPLACE предложением 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

Надеюсь, это поможет любому, кто ищет решение.

С уважением

5
ответ дан Junaid 31 August 2018 в 23:34
поделиться

Я тоже хотел это сделать, поэтому создал функцию.

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», «anycolumn»)

Итак, в select вы можете использовать его следующим образом:

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

или

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
3
ответ дан Kilise 31 August 2018 в 23:34
поделиться

Ответ, отправленный 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>:

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 », в моем случае это работает, потому что я пытался сохранить память. (Поле, которое я удалял, представляет собой BLOB размером около 1 МБ)

2
ответ дан Mat 31 August 2018 в 23:34
поделиться

Хорошей практикой является указание столбцов, которые вы запрашиваете, даже если вы запрашиваете все столбцы.

Поэтому я бы предложил вам написать имя каждого столбца в заявлении (за исключением того, 't want).

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

FROM table
4
ответ дан mbillard 31 August 2018 в 23:34
поделиться

Вы можете сделать:

SELECT column1, column2, column4 FROM table WHERE whatever

без получения столбца3, хотя, возможно, вы искали более общее решение?

31
ответ дан Mike Stone 31 August 2018 в 23:34
поделиться

Согласитесь с ответом @ Mahomedalid. Но я не хотел делать что-то вроде подготовленного заявления, и я не хотел вводить все поля. Так что у меня было глупое решение. Перейдите в таблицу в phpmyadmin-> sql-> select, он сбрасывает копию запроса и выполняет! :)

2
ответ дан neelabh 31 August 2018 в 23:34
поделиться

Im довольно поздно, чтобы вырвать ответ за это, так я всегда делал это, и, честно говоря, он в 100 раз лучше и лучше, чем лучший ответ, я только надеюсь, что кто-то это увидит. И найдите это полезным

    //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]);
-1
ответ дан Nick 31 August 2018 в 23:34
поделиться

Я согласен с тем, что этого недостаточно Select *, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы этот накладной ползунок внутри.

Я бы создал представление с требуемыми данными, тогда вы можете Select * в комфорте - если программное обеспечение базы данных их поддерживает. Иначе, поместите огромные данные в другую таблицу.

3
ответ дан nlucaroni 31 August 2018 в 23:34
поделиться

Хотя я согласен с ответом Томаса (+1;)), я хотел бы добавить оговорку, что я предположим, что столбец, который вы не хотите , содержит едва ли какие-либо данные. Если он содержит огромное количество текста, xml или двоичных blobs, то найдите время, чтобы выбрать каждый столбец отдельно. В противном случае ваша производительность будет нарушена. Ура!

2
ответ дан OJ. 31 August 2018 в 23:34
поделиться

Если вы хотите исключить значение поля, например. для проблем безопасности / чувствительной информации вы можете получить этот столбец как null.

, например

SELECT *, NULL AS salary FROM users
28
ответ дан Sean O 31 August 2018 в 23:34
поделиться

Просто сделайте

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,";
   }      
}
3
ответ дан Soth 31 August 2018 в 23:34
поделиться

Если столбец, который вы не хотели выбирать, содержал в нем огромное количество данных, и вы не хотели его включать из-за проблем с производительностью, и вы часто выбираете другие столбцы, я бы предложил вам создать новую таблицу с одним полем, которое обычно не выбирается с помощью ключа к исходной таблице и удаляет поле из исходной таблицы. Присоединитесь к таблицам, когда это дополнительное поле действительно требуется.

12
ответ дан Stacey Richards 31 August 2018 в 23:34
поделиться

Вы можете использовать SQL для генерации SQL, если хотите, и оценить SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.

Подстановка

  • MYSQL с вашей командой mysql
  • TABLE с именем таблицы
  • 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 в строках запроса.

37
ответ дан sth 31 August 2018 в 23:34
поделиться

При попытке решения @Mahomedalid и @Junaid я обнаружил проблему. Так подумал об обмене. Если имя столбца имеет пробелы или дефисы, такие как регистрация, запрос будет терпеть неудачу. Простым обходным решением является использование обратных ссылок вокруг имен столбцов. Измененный запрос ниже

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;
13
ответ дан Suraj 31 August 2018 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: