sql中奇数、偶数、正则
在sql中,mod()和%都是用来取余的操作符。在很多 SQL 实现中,它们可以互换使用,都可以用来计算一个数除以另一个数的余数。
方法一:使用mod()
mod(a,b) 在sql中的意思是 a / b 的余数
mod(id, 2)=1 是指id是奇数。
mod(id, 2)=0 是指id是偶数。
select * from employees where mod(emp_no,2) = 1
and
last_name <> 'Mary'
order by hire_date desc;
方法二:使用%
如id是奇数:(id % 2) = 1;
id是偶数:(id % 2) = 0;
select * from employees where emp_no % 2 = 1
and
last_name <> 'Mary'
order by hire_date desc;
方法三:使用&
在 SQL 中,& 是按位与运算符,它用于执行按位与操作。按位与操作会将两个数的每个对应位进行比较,如果两个对应位都为 1,则结果位为 1,否则结果位为 0。
& 操作符可以用来判断一个数是奇数还是偶数。
在二进制表示中,奇数的最低位(最右边的位)是1,偶数的最低位是0。因此,如果一个数是奇数,那么它的二进制表示的最低位为1;如果一个数是偶数,那么它的二进制表示的最低位为0。
通过使用按位与操作符 &,你可以检查一个数的最低位是1还是0。如果最低位是1,则这个数是奇数;如果最低位是0,则这个数是偶数。
如id是奇数:(id & 1) = 1;
id是偶数:(id & 1) = 0;
select * from employees where emp_no & 1 = 1
and
last_name <> 'Mary'
order by hire_date desc;
方法四: id = (id >> 1 << 1)?
判断偶数也可以用如 id = (id >> 1 << 1),先除2向下取整,再乘以2,和原来的值相等就是偶数,不等就是奇数。id >> 1 是进行位操作,id的二进制向右移动一位,右移一位相当于除以2向下取整,<< 1 表示将上一步结果向左移动一位,左移一位相当于乘以2 。比如:
假设 id 的初始值是 5:
- id >> 1:将 5(101) 右移一位得到 2(10)。
- 2 << 1:将 2(10) 左移一位得到 4(100)。
上面的方法只能判断全是数字的情况,
比如查询身份证号是以奇数结尾和以偶数结尾的问题可以使用上述办法,但如果数字中出现其他字符,比如:身份证号码中间用*号隐藏了一部分,
130185******184112
330621******224665
422822******054037
就不能用上面的方法判断了,这时候可以使用正则表达式。
查询偶数:
select idcard from user_info a where a.idcard regexp '[13579]$' limit 5;
查询奇数:
select idcard from user_info a where a.idcard regexp '[02468]$' limit 5;
正则表达式:
^aa:以aa为开头
aa$:以aa为结尾
[abc]:[字符合集],包括中括号里的字符
[^abc]:不包括中括号里是字符
a|b|c:匹配a或b或c
. :匹配任何字符
{n} :n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o;
{n,m} :m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
* :匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,};
+ :匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,};
比如:查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';