在哪里IS NOT NULL

时间:2010-06-24 08:21:20

标签: sql mysql

如何运行MySQL查询,选择非空的所有内容?这就像是

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

我是否只需删除所有内容然后去...?

SELECT * FROM schedule WHERE IS NOT NULL

10 个答案:

答案 0 :(得分:23)

您必须明确说明每列的条件,例如

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

答案 1 :(得分:13)

您可以连接字段以便只写入where-condition:

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

答案 2 :(得分:6)

您需要通过查看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

答案 3 :(得分:5)

这完全取决于你所说的“非空的一切”:

  • 所有列不得为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 :(得分:3)

我刚看了你的linked question并同意Guffa的回答,你应该规范你的数据库。

Linked Question Image

上面看起来更像电子表格,然后属于RDBMS。

以您希望的方式回答您对此问题的疑虑。您可以编写一个数据透视查询并将其放在视图中以模仿当前的表结构并将其用于显示查询。

这样就可以避免在你想要搜索数据时找到一些可怕的24列WHERE子句,或者在这个问题中找出它是否为NULL。

答案 5 :(得分:0)

如果您正在使用与sql结合使用的其他编程语言,则可以通过循环列名列表并使用参数执行if not null检查来加速此过程,而不必单独键入它们,例如< / p>

**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循环运行后在一个批处理中执行上述操作。

答案 6 :(得分:0)

使用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' 

答案 7 :(得分:0)

这仅适用于char和varchar类型。如果您有其他数据类型,则会抛出错误。

TOP   :_N_=1 i=. j=.
MIDDLE:_N_=1 i=1 j=.
BOTTOM:_N_=1 i=1 j=1

TOP   :_N_=2 i=1 j=1
MIDDLE:_N_=2 i=2 j=1
BOTTOM:_N_=2 i=2 j=1

TOP   :_N_=3 i=2 j=1
MIDDLE:_N_=3 i=3 j=1
BOTTOM:_N_=3 i=3 j=1

TOP   :_N_=4 i=3 j=1
MIDDLE:_N_=4 i=. j=5
BOTTOM:_N_=4 i=. j=5

TOP   :_N_=5 i=. j=5
MIDDLE:_N_=5 i=. j=6
BOTTOM:_N_=5 i=. j=6

TOP   :_N_=6 i=. j=6
MIDDLE:_N_=6 i=. j=7
BOTTOM:_N_=6 i=. j=7

TOP   :_N_=7 i=. j=7

不一致的数据类型:期望SELECT * FROM SCHEDULE WHERE coa lesce(ID, FOO, BAR) IS NOT NULL; 得到CHAR 注意:此处DATE是日期类型。

答案 8 :(得分:0)

此命令将帮助您检查所有 column_values 是否为空

SELECT * FROM table_name WHERE CONCAT(column_name,column_name....) IS NOT NULL; 

答案 9 :(得分:-1)

这样做,但to replace someone else's horrible idea.,尤其是不要这样做 - 这就是他们的建议:

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

Just do what the accepted answer says