Как я могу запустить MySQL-запрос, который выбирает все, что не является нулевым? Это было бы что-то вроде
SELECT * FROM schedule WHERE ((all)) IS NOT NULL
Я просто удаляю все и ухожу.?
SELECT * FROM schedule WHERE IS NOT NULL
Как я могу запустить MySQL-запрос, который выбирает все, что не является нулевым? Это было бы что-то вроде
SELECT * FROM schedule WHERE ((all)) IS NOT NULL
Я просто удаляю все и ухожу.?
SELECT * FROM schedule WHERE IS NOT NULL
Вам нужно будет явно указать условие для каждого столбца, например,
SELECT *
FROM schedule
WHERE id IS NOT NULL
AND foo IS NOT NULL
AND bar IS NOT NULL; -- and so on..
Вы можете объединить поля, чтобы писать только условие-условия:
SELECT *
FROM SCHEDULE
WHERE ID || FOO || BAR IS NOT NULL;
Это зависит от того, что вы имеете в виду именно "все, что не пусто":
все столбцы не должны быть 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 специальный синтаксис для этого.
Вам нужно получить список столбцов вашей таблицы, просмотрев базу данных 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
Я только что посмотрел на ваш связанный вопрос и согласен с ответом Гуффа, что вы должны нормализовать свою базу данных.
Вышеизложенное выглядит скорее как электронная таблица, чем то, что принадлежит к РСУБД.
Чтобы ответить на ваши опасения по поводу того, как вы выглядите так, как вы хотите. Вы можете написать сводный запрос и поместить его в представление, чтобы имитировать вашу текущую структуру таблицы и использовать ее для вашего запроса на отображение.
Это позволит избежать необходимости в каком-то ужасном 24 столбце предложения WHERE всякий раз, когда вы хотите искать данные или узнать, является ли оно NULL, как в этом вопросе.
Если вы используете другой язык программирования в сочетании с 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.
Используйте 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'
это работает только с char и varchar. Если у вас есть другие типы данных, это вызывает ошибку.
SELECT *
FROM SCHEDULE
WHERE coa
lesce(ID, FOO, BAR) IS NOT NULL;
непоследовательные типы данных: ожидаемый CHAR
получил DATE
Примечание: здесь FOO
имеет тип даты.
Я бы этого не сделал, но чтобы заменить чужую ужасную идею., особенно не делайте этого - вот что они предложили:
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
.