MySQL仅选择非空值

22 浏览
0 Comments

MySQL仅选择非空值

有没有可能执行一个仅返回非空值的SELECT语句?

目前我正在使用以下语句:

SELECT * FROM 表名

然后我必须使用PHP循环来过滤掉空值。

是否有一种方法可以执行以下操作:

SELECT *(非空)FROM 表名

目前当我选择*时,我会得到val1,val2,val3,null,val4,val5,null,null等值...但我只想在结果中获取非空值。是否有一种不需要通过循环进行过滤的方法?

0
0 Comments

MySQL SELECT only not null values的问题是如何在查询结果中只返回非空值。出现这个问题的原因是查询结果中包含了空值,但是希望只返回非空值。解决方法是使用WHERE子句来过滤出不包含空值的行。

如果想要过滤掉包含特定列中空值的行,可以使用以下语句:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

如果想要过滤掉包含任何列中空值的行,可以使用以下语句:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

如果希望在查询结果中只返回非空值,可以使用以下语句:

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

需要注意的是,如果需要频繁地进行这样的查询,可能需要重新设计数据库结构以避免出现大量的空值。

0
0 Comments

MySQL SELECT only not null values的问题是出现原因是为了只选择不为null的值。使用上述的查询语句可以实现这个目的。然而,这种方法的缺点是只能比较5个列,超过5个列之后,结果将始终为false。因此,最好只比较可能为null的字段。下面是解决这个问题的代码:

Select * from your_table 
WHERE col1 is not null and col2 is not null and col3 is not null and col4 is not null and col5 is not null;

这个查询语句将只返回那些col1、col2、col3、col4和col5都不为null的行。通过使用is not null操作符,我们可以确保只选择这些行。这是一个简单而有效的解决方法。

0
0 Comments

MySQL SELECT只选择非空值的原因是使用比较运算符=和<>时,如果表达式两边有NULL值,它们会返回UNKNOWN。因此,我们需要使用IS NOT NULL来选择非空值。

解决方法是在SELECT语句中使用IS NOT NULL条件,如下所示:

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

在MySQL中,还可以使用null safe equality operator(不是标准SQL)来否定NULL值。如下所示:

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

除了以上两种方法,还可以通过改变表结构来更轻松地完成任务。但是,如果表没有符合第一范式,可以使用下面的方法选择非空值:

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

上述方法的缺点是它为每个列扫描表多次。以下方法可能可以避免这个问题,但我没有在MySQL中测试过:

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

最后一种方法中,使用了CASE语句而不是CASE函数。所以在SELECT CASE部分,应该使用END CASE而不是END。这种方法的作用是选择非空值,并将其命名为val。

对于不太熟悉的人,我来解释一下最后一种解决方案。第一个SELECT语句中的idx是来自第二个SELECT语句中的idx吗? CASE语句的目的是什么?第二个SELECT语句实际上在做什么?你使用的是内连接而不是交叉连接,对吗?

我不认为这个回答回答了问题。问问题的人似乎想选择(我假设是一个特定的)行,但排除结果中所有为空的列-这个答案要求您要么指定哪些列不允许为空(这是一个完全不同的问题),要么指定所有列,对于有许多列的表来说不合适(例如类似于SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue"的语句)-提问者接受了这个答案,所以可以假设它对他们来说已经足够回答了问题。请随时添加自己的答案或提出新问题。

我认为这更多是因为它解决了他的问题,而不是回答了他的问题,而且听起来他想要的东西不可能像上面那样简洁地实现。

这是一个很好的答案,非常完整:) - 谢谢

0