Подтвердить что ты не робот

ГДЕ ВСЕ НЕ НУЛЬНО

Как я могу запустить MySQL-запрос, который выбирает все, что не является нулевым? Это было бы что-то вроде

SELECT * FROM schedule WHERE ((all)) IS NOT NULL

Я просто удаляю все и ухожу.?

SELECT * FROM schedule WHERE IS NOT NULL
4b9b3361

Ответ 1

Вам нужно будет явно указать условие для каждого столбца, например,

SELECT *
FROM schedule 
WHERE id IS NOT NULL
  AND foo IS NOT NULL
  AND bar IS NOT NULL; -- and so on..

Ответ 2

Вы можете объединить поля, чтобы писать только условие-условия:

SELECT *
  FROM SCHEDULE
 WHERE ID || FOO || BAR IS NOT NULL;

Ответ 3

Это зависит от того, что вы имеете в виду именно "все, что не пусто":

  • все столбцы не должны быть null

    select * from schedule where col1 is not null AND col2 is not null AND ..

  • как минимум один столбец должен быть non-null

    select * from schedule where col1 is not null OR col 2 is not null OR ..

По крайней мере, так вы можете сделать это в "общем sql". Я не знаю, имеет ли MySql специальный синтаксис для этого.

Ответ 4

Вам нужно получить список столбцов вашей таблицы, просмотрев базу данных information_schema.

Предположим, что ваша база данных называется mydata, а ваша таблица называется mytable. Вы можете получить список столбцов с нулевым столбцом, выпустив следующий оператор:

SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'mydata'
    AND `TABLE_NAME` = 'mytable'
    AND `IS_NULLABLE` = 'YES'

Наш окончательный запрос будет выглядеть так:

SELECT * FROM `mydata`.`mytable`
WHERE CONCAT(<list of columns>) IS NOT NULL

Теперь нам не хватает списка столбцов с нулевым значением, разделенных запятой. Мы будем использовать функцию GROUP_CONCAT для создания окончательного утверждения, которое мы будем выполнять следующим образом:

SET @query = CONCAT(
    'SELECT * FROM `mydata`.`mytable` WHERE CONCAT(',
    (SELECT GROUP_CONCAT(COLUMN_NAME)
        FROM `information_schema`.`COLUMNS`
        WHERE `TABLE_SCHEMA` = 'mydata' AND
        `TABLE_NAME` = 'mytable'
        AND `IS_NULLABLE` = 'YES'),
    ') IS NOT NULL');

PREPARE stmt_name FROM @query;

EXECUTE stmt_name;

Литература:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

Ответ 5

Я только что посмотрел на ваш связанный вопрос и согласен с ответом Гуффа, что вы должны нормализовать свою базу данных.

Linked Question Image

Вышеизложенное выглядит скорее как электронная таблица, чем то, что принадлежит к РСУБД.

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

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

Ответ 6

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

**code SQL**

Select *
FROM Schedule
WHERE @ColumnName IS NOT NULL

**code c#**

for(int i =0; i<parameterArray[].length; i++)
{
command.Parameters.Add(new SqlParameter("ColumnName", parameterArray[i]));
command.Execute();
}

Я бы предложил использовать транзакции, чтобы вы могли сделать это в одной партии после прогона цикла for.

Ответ 7

Используйте XML, чтобы не перебирать все столбцы:

--Your Source Table
CREATE TABLE [dbo].[schedule](
    [id] [nchar](10) NULL,
    [col1] [nchar](10) NULL,
    [col2] [nchar](10) NULL,
    [col3] [nchar](10) NULL
) ON [PRIMARY]

--I know my result should show items NOT NULL, like id:2,col1,val:'a'
  INSERT INTO [schedule](id,col1,col2,col3)
  values 
  (1,null,null,null),
  (2,'a',null,null),
  (3,null,'b',null),
  (4,null,null,null),
  (5,null,null,'c')

--temp placeholder table 
CREATE TABLE #tempsch (id VARCHAR(max) not null, schColumns XML) 

--Load temp table with XML version of your table
INSERT INTO #tempsch (id, schColumns)
        SELECT  s.id,
            (   SELECT * 
                FROM    [schedule] AS x
                WHERE   x.id = s.id
                FOR XML PATH('bar'), TYPE, ROOT('foo')
            ) AS xml_format_string
        FROM [schedule] AS s


--This select should return all values Where all is NOT NULL
SELECT id,
sd.c.value('local-name(.)', 'VARCHAR(MAX)') AS elementName, 
sd.c.value('.', 'VARCHAR(MAX)') AS elementValue
FROM #tempsch s
CROSS APPLY schColumns.nodes('/foo/bar/*') sd(c)
WHERE 
sd.c.value('local-name(.)', 'VARCHAR(MAX)') <> 'id' 

Ответ 8

это работает только с char и varchar. Если у вас есть другие типы данных, это вызывает ошибку.

SELECT *
  FROM SCHEDULE
WHERE coa

lesce(ID, FOO, BAR) IS NOT NULL;

непоследовательные типы данных: ожидаемый CHAR получил DATE Примечание: здесь FOO имеет тип даты.

Ответ 9

Я бы этого не сделал, но чтобы заменить чужую ужасную идею., особенно не делайте этого - вот что они предложили:

SELECT *
  FROM SCHEDULE
 WHERE ID || FOO || BAR IS NOT NULL;

Не делай этого, но, по крайней мере, это не так плохо...

SELECT *
  FROM SCHEDULE
WHERE coalesce(ID, FOO, BAR) IS NOT NULL;

Это, по крайней мере, работает в других версиях SQL, а некоторые компиляторы расширят его до серии IS NOT NULL.

Просто выполните то, что говорит принятый ответ