我有一个查询,其中一个条件来检查房间号码是否为奇数/偶数。问题是房间号码与建筑物信息一起存储在一个字符串中。
以下是数据库中数据的格式:
ABC-0101A (Odd)
ABC-0112B (Even)
ZYX-123A1 (Odd)
ZYX-456B1 (Even)
如果房间号码被视为偶数/奇数,则取决于短划线后第一个字母前的最后一个数字。
答案 0 :(得分:1)
如果您可以将数字部分单独存储在另一列中,这将更加容易且性能更高。作为长期解决方案,我建议这样做。
但是你可以在这里使用正则表达式来匹配第一个数字之前的最后一个数字,一组偶数[02468]
和一组带有[13579]
语句的奇数CASE
。
SELECT
CASE
WHEN room REGEXP '-[0-9]*[02468][A-Z]' THEN 'even'
WHEN room REGEXP '-[0-9]*[13579][A-Z]' THEN 'odd'
ELSE 'something else entirely'
END
FROM rooms
模式-[0-9]*
匹配文字连字符后跟零个或多个数字。然后,重要的部分是[02468]
或[13579]
设置为匹配偶数或奇数位,必须紧接在[A-Z]
之前与下一个字母匹配。
以下是演示:http://sqlfiddle.com/#!9/464d1d/3
匹配均匀的房间:
SELECT 'ABC-0112B' REGEXP '-[0-9]*[02468][A-Z]';
+------------------------------------------+
| 'ABC-0112B' REGEXP '-[0-9]*[02468][A-Z]' |
+------------------------------------------+
| 1 |
+------------------------------------------+
匹配奇数房间的示例:
SELECT 'ABC-0101A' REGEXP '-[0-9]*[13579][A-Z]';
+------------------------------------------+
| 'ABC-0101A' REGEXP '-[0-9]*[13579][A-Z]' |
+------------------------------------------+
| 1 |
+------------------------------------------+
匹配一个不以字母结尾的奇数房间的示例:
SELECT 'ABC-0101A11' REGEXP '-[0-9]*[13579][A-Z]';
+--------------------------------------------+
| 'ABC-0101A11' REGEXP '-[0-9]*[13579][A-Z]' |
+--------------------------------------------+
| 1 |
+--------------------------------------------+
答案 1 :(得分:0)
首先创建一个函数IsNumeric,如果number是整数则返回1,否则返回0:
select IF (IsNumeric(right(room,1))>0,
IF(right(room,1)%2=0,'Even','ODD'),
IF(left(right(room,2),1)%2=0,'Even','ODD')
) as room_number
from rooms;
然后使用以下查询来检查房间号:
{{1}}
在上面的查询中首先检查最后一位是否为整数,如果是,则检查偶数/奇数。如果数字不是整数,则选择倒数第二个数字并应用相同的检查。