Mysql查询在where子句中包含空值


mysql query to include null values in where clause

我有一个表member1,它看起来像这样。我正在编辑我的表,为什么我想从pst返回所有值。

id  club_id mobile      pst
1     1     9437054788  6
2     1     9437345602  NULL
3     2     9437056738  35
4     2     9437064876  39
5     1     9437059927  NULL
6     2     9437965276  40
7     1     9437121455  NULL

我有一个下拉字段,一个用于club_id,另一个复选框字段用于pst,两个字段的值都为'select All'。'select All' = '%'.

@ thecconstructor提供的解决方案在这个查询

中工作得很好
SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '') 
LIKE '%' and club_id=1

SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '') 
LIKE '6' and club_id=1

现在我想在查询中使用多个值来代替'6',例如

SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '') 
in (6,35,39,40) or in ('%') and club_id=1

我怎么能做到这一点,因为目前我可以返回结果只有一个值,即6或35或39或40

您将注意到NULL LIKE '%'不会计算为TRUE,并且pstNULL的行被排除在结果之外。现在有一个不同的方法来包括行pstNULL;以下是其中的三个:

  1. 如果你想得到所有的行,你可以把WHERE都去掉。

    SELECT group_concat(mobile) FROM `member1`;
    
  2. 如果您希望始终包含NULL,您可以添加OR pst IS NULL。(可以在列pst上使用索引)

    SELECT group_concat(mobile) FROM `member1` WHERE pst LIKE '%' OR pst IS NULL;
    

    如果你打算为另一个谓词更改LIKE '%',这可能是大表上最快的SQL。

  3. 如果您想将NULL视为空字符串,您可以使用:(将不使用列pst上的索引)

    SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '') LIKE '%'
    

    COALESCE(pst, '')将给出pst列内的值,如果它不是NULL'',如果pst是NULL

    虽然我认为这是最灵活的一个,因为你只需要将'%'更改为不同的东西来开始过滤并排除NULL -值,MySQL的优化器将可悲地处理这个不同于第二个查询,这将花费你在pst有索引的大表上的性能。

最后需要注意的是,GROUP_CONCAT默认情况下只返回1024个字符。这可以通过将group_concat_max_len设置为更大的值来更改。

如果我误解了你的问题,请原谅我,但我认为你只是想:

SELECT group_concat(mobile) FROM member1

WHERE pst LIKE '%'中的%是一个通配符,表示0个或多个字符,因此查询将返回任何NOT NULL pst记录。如果你需要这个逻辑,你最好使用WHERE pst IS NOT NULL

如果你需要检查实际字符%,你需要转义它;WHERE pst LIKE ''%' . .但这与WHERE pst = '%'的逻辑相同,因为您正在检查是否相等。

我仍然在努力理解你,但如果你正在检查一个手机号码的数据库中是否存在,最简单的查询是:

SELECT 1 FROM member1 WHERE mobile = ?

其中?是您的传入变量,返回的任何行表示记录存在。请确保您使用的绑定方法是安全的SQL注入。

除了当我将数据显示为CSV时,我还会避免在每种情况下使用GROUP_CONCAT。如果您正在从结果中构建一个下拉列表…只需在数组中插入单独的行,然后在构建HTML时遍历它。

似乎您正在使用该值原样,从表单数据的权利。您确定这不会导致安全问题吗?

我会从$_POST中获取值,测试它,根据测试创建一个具有正确WHERE部分查询的变量,并在查询字符串中使用它。