ChatGPT解决这个技术问题 Extra ChatGPT

MySQL SELECT 仅不是空值

是否可以执行仅采用 NOT NULL 值的 select 语句?

现在我正在使用这个:

SELECT * FROM table

然后我必须用 php 循环过滤掉空值。

有没有办法:

SELECT * (that are NOT NULL) FROM table

?

现在,当我选择 * 时,我得到 val1,val2,val3,null,val4,val5,null,null 等......但我只想得到结果中不为 null 的值。如果不使用循环过滤,这可能吗?

如果某行的某些列具有 NULL 值而其他列没有 NULL 值,您希望发生什么?
我只想从不为空的列中获取值,并且只返回行中不为空的列值。现在我使用循环将它们过滤掉,是否可以在没有循环的情况下做到这一点?
@bryan - 你的表结构是什么?所有列都具有相同的数据类型吗?
@bryan - 那么你理想的结果集会是什么样子呢?包含所有非空值的单列结果集?如果不使用示例数据和所需结果编辑您的问题会有所帮助...
@bryan - 听起来你的桌子很可能有跨列的重复组? (如果是这种情况,请参阅 Wiki 文章以获取解释和建议的替代结构 en.wikipedia.org/wiki/First_normal_form

M
Martin Smith

您应该使用 IS NOT NULL。 (比较运算符 =<> 都给出 UNKNOWNNULL 在表达式的任一侧。)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

为了完整起见,我将提到在 MySQL 中您也可以否定 null safe equality operator,但这不是标准 SQL。

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 函数。那么它不应该是 END CASE 而不是 SELECT CASE ... 部分中的 END 吗?
对于不太专业的人,你能解释一下最后的解决方案吗?第一个 SELECTidx rom 是否来自第二个 SELECT 中的 idxCASE 语句试图完成什么?第二个 SELECT 实际上做了什么?你正在做一个内部连接,而不是一个交叉连接,对吧?
我不认为这回答了这个问题。听起来 OP 想要选择(我假设一个特定的)行但从该结果中排除所有为空的列 - 这个答案要求您指定哪些列不允许为空(这完全是一个不同的问题)或指定所有列,不适合列多的表
(例如类似于 SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue" 的东西)
M
Mark Byers

您可以过滤掉特定列中包含 NULL 值的行:

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

如果要过滤掉任何列中包含 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

我同意 Martin 的观点,如果你需要这样做,那么你可能应该改变你的数据库设计。


我不确定我是否解释得足够好,但我会尝试更好一点。现在,当我选择 * 时,我得到 val1,val2,val3,null,val4,val5,null,null 等......但我只想得到结果中不为 null 的值。如果不使用循环过滤,这可能吗?
@bryan - 你能解释一下 * 返回的列吗?也许在您的问题中提供一些示例数据,因为从您上面的评论中不清楚这是否都是一列。
现在, * 返回行中的所有值。即 val1,val2,val3,null,val4,val5,null,null。但我希望它只返回不为空的列值。现在我用一个循环来过滤掉它返回结果后的值。
A
Aniket Kulkarni
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

这种方法的唯一缺点是您只能比较 5 列,之后结果将始终为 false,所以我只比较可以为 NULL 的字段。


p
porquero

我找到了这个解决方案:

此查询为每列选择最后一个非空值。

例子

如果你有一张桌子:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

你得到:

title|body
t3   |b2

询问

SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

我希望能帮助你。


GROUP_CONCAT(body) 作为正文
B
Basant

以下查询为我工作

当我设置列'NULL'的默认值时

select * from table where column IS NOT NULL

当我没有设置默认值时

select * from table where column <>''

s
soulshake

我在 MySQL 中使用 \! 命令从 shell 中 grep 出 NULL 值:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

它最适用于指定数据库/用户名/密码的正确 .my.cnf。这样,您只需用 \! mysql e| grep -v NULLselect 包围起来。


D
Developer

MYSQL IS NOT NULL WITH JOINS AND SELECT, INSERT INTO, DELETE & LOGICAL OPERATOR LIKE OR , NOT

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

S
Sᴀᴍ Onᴇᴌᴀ

是的,在您的查询中使用 NOT NULL,如下所示。

SELECT * 
FROM table
WHERE col IS NOT NULL;

S
Syscall
SELECT duration,id FROM `tickets` WHERE duration !=""

P
Pang
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

这不是选择空的。问题是选择非空值
' ' 和 null 不同