MySQL查询辅助 - 忽略查询中的空值(使用PERL和Regex)

时间:2013-05-16 02:21:40

标签: mysql perl

我有一个脚本,最多可以向MySQL查询传递3个命令行参数。它所查询的表格列出了职业运动员和他们所参加的运动。我在命令行中的参数设置为-s(用于运动)-i(用于整数)和-l(用于字母)。

-s是一个直接的字符串搜索(所以'Hockey'返回运动员列出'曲棍球'的运动员),-i是一个整数,并且搜索应该返回名字少于的字符数的玩家或者等于我的整数,-l是一个字母,这样搜索就会返回名字以a和'-l'之间的字母开头的玩家。

目前我的搜索如下:

"Select * from Players_Sport where Sport like '$lsport_search' AND length(Player)<='$linteger_search' AND Player between 'a%' and '$lletter_search%'"

现在,当整数和字母参数不为空时,这是有效的,尽管它在运动场空白时确实有效。我明白为什么它不起作用(它检查长度(播放器)&lt; null和播放器在%和null之间)。如果每个可能的迭代都有条件,我能做些什么来让它无需写入就能工作?

1 个答案:

答案 0 :(得分:1)

首先关闭 - 表中的Player和Sport列不应为NULL。拥有没有运动的球员就像你设置它一样没有意义。在您的CREATE TABLE中,请务必将这些字段设置为NOT NULL。

其次,您的程序是否始终需要-s,-i和-l?如果是,请像这样写

SELECT * FROM Players_Sport
WHERE
Sport = '$lsport_search'
AND LEN(Player) <= '$linteger_search'
AND Player BETWEEN 'A' AND '$lletter_search'

如果-s,-i和-l并非总是存在,那么只使用您需要的选项来构建查询。你也可以使用各种LEN,OR,CASE等,但它很难看。

SELECT * FROM Players_Sport
WHERE
(Sport = '$lsport_search' OR LEN('$lsport_search') = 0)
AND (LEN(Player) <= '$linteger_search' OR LEN('$linteger_search') = 0)
AND (Player BETWEEN 'A' AND '$lletter_search' OR LEN('$lletter_search') = 0)

最后但并非最不重要的是,就像其他人说的那样,最终你需要小心,像$ lsport_search这样的东西并不是特殊字符。有时顽皮的人会去,在一个字符串的中间插入一个',打开恶作剧的大门。