[英]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'。 “全选”等于“%”。
@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
如您所知, NULL LIKE '%'
取值不会为TRUE
并且结果中排除了pst
为NULL
行。 现在有一种不同的方法可以包含pst
为NULL
行; 这是其中的三个:
如果要获取所有行,则可以只将WHERE
放在WHERE
。
SELECT group_concat(mobile) FROM `member1`;
如果要始终包含NULL
,则可以添加OR pst IS NULL
。 (可以在pst
列上使用索引)
SELECT group_concat(mobile) FROM `member1` WHERE pst LIKE '%' OR pst IS NULL;
如果计划为另一个谓词更改LIKE '%'
,则这可能是较大表上最快的SQL。
如果您想将NULL
视为空字符串,可以使用:(不会在pst
列上使用index)
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 '%'
是零个或多个任意字符的通配符,因此查询将返回任何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部分创建一个变量,并在查询字符串中使用该变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.