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

时间:2014-08-17 10:54:14

标签: php mysql

我有一个表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的复选框字段,其值为'选择全部'在这两个领域。 '选择全部'等于'%'。

@TheConstructor提供的解决方案在此查询中运行良好

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

3 个答案:

答案 0 :(得分:2)

您将注意到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 '%'
    
    如果pst为pst

    COALESCE(pst, '')将在NULL列中提供值,如果pst为''则为NULL

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

  4. 最后一点需要注意,GROUP_CONCAT默认只返回1024个字符。这可以通过将group_concat_max_len设置为更高的值来更改。

答案 1 :(得分:1)

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

SELECT group_concat(mobile) FROM member1

%中的WHERE pst LIKE '%'是任意字符零或更多的通配符,因此查询将返回任何NOT NULL pst记录..您最好使用{{1}如果你需要那个逻辑。

如果你需要检查实际的角色WHERE pst IS NOT NULL,你需要逃脱它; % ..但这与WHERE pst LIKE '\%'的逻辑相同,因为您正在检查是否相等。

我仍然在努力了解你,但如果你在移动电话号码数据库中检查是否存在,最简单的查询是:

WHERE pst = '%'

SELECT 1 FROM member1 WHERE mobile = ? ,你的传递变量和返回的任何行意味着记录存在。确保使用SQL注入安全的绑定方法。

除了我将数据显示为CSV之外,我还会回避在每种情况下都使用?。如果要从结果中构建一个下拉列表,只需拉入数组中的单独行,然后在构建HTML时运行它。

答案 2 :(得分:0)

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

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

相关问题