首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在与python的truthy / falsy / bool概念等价的sql检查?

问是否存在与python的truthy / falsy / bool概念等价的sql检查?
EN

Database Administration用户
提问于 2022-03-11 02:19:50
回答 2查看 278关注 0票数 0

我试图在连接到python的mysql数据库中找到特定列的用法。Python将以下内容计算为“falsy”:

  • 空名单:[]
  • 空元组:()
  • 空字典:{}
  • 空字符串"“
  • 整数:0
  • 浮动: 0.0
  • 无
  • 错误

我意识到这在某种程度上是与ORM有关的(例如,空数据类型存储为NULL而不是字符串),但下面的内容是否有点等价,是否有更好的方法,以及是否有明显的遗漏?可能是0.0?其思想是计算一个row_count并减去这个结果。我尝试了NOT IN的真实性,但似乎没有得到一致的结果。

代码语言:javascript
复制
SELECT COUNT(*) FROM `tabBatch` WHERE naming_series IN ('', 0, NULL);
EN

回答 2

Database Administration用户

回答已采纳

发布于 2022-03-11 20:40:22

最后,我发现这做了我所需要的,因为我需要在查询中多次使用它,并且它必须处理各种字段类型(您不能从CHAR转换成INT,似乎只有up )。

合并用于没有行的表,在这种情况下,SUM返回NULL。这是有用的,因为在另一个应用程序中,我想区分零行(SUM = NULL)和空行(SUM = 0)。

代码语言:javascript
复制
sql_truthy = """
  COALESCE(SUM(
    CASE WHEN `{field}` IS NULL THEN 0
         WHEN CAST(`{field}` AS CHAR) IN ('0', '0.0', '') THEN 0
         ELSE 1
    END
  ), 0) AS used"""

使用它作为列字段而不是WHERE子句的优点是,它可以在同一个查询中多次用于多个字段。WHERE子句需要对每个字段进行查询。

奖励:我使用一个COUNT(*) as total来查找同一个查询中的总行。

票数 0
EN

Database Administration用户

发布于 2022-03-11 20:37:21

  • MySQL返回3种类型的"true/false":0 (false)、1 (true)、NULL。
  • 在大多数涉及NULL的情况下,结果将是NULL。
  • 您只能使用以下方法来测试NULL:IS NULL、IS NOT NULL、<=>。(好吧,我可能忘了什么。)也见,COALESCE()。
  • 当一个列声明为NOT NULL时,它不能存储一个NULL;尝试这样做可能会存储0/ 0.0 / '‘。
  • 尽量避免效率低下的WHERE x IS NULL OR x = 0;为您的“异常”情况选择一个或另一个。
  • NULL有许多可能的用途;让我们讨论一下您的特定业务逻辑。这一一般性讨论可能不够。
  • 如果子查询可能不返回任何行,请考虑EXISTS(SELECT 1 FROM .. WHERE ...)是否工作得更快。它总是返回0或1。
  • NULL值被某些聚合忽略(参见GROUP BY)。

运行这些代码可以看到一些示例:

代码语言:javascript
复制
SELECT NULL IN (1, 2);  --> NULL
SELECT 1 IN (1, NULL);  --> 1
SELECT 1 IN (2, NULL);  --> NULL
SELECT NULL IN (1, NULL); --> NULL

可以这样想,NULL表示任何可能的值;它不知道哪个值。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/308589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档