Как использовать оператор сравнения для числовой строки в mysql?

У меня есть таблица сотрудников, в которой есть поле, подобное опыту с типом varchar, в этом поле сочетаются как общий год, так и общий месяц, разделенные тире (-), поэтому я должен фильтровать опыт по годам, у которого более 3 лет опыта.

моя структура таблицы:

введите описание изображения здесь

Так что теперь мне нужно получить более 3-х лет опыта работы с id. Я пробовал, как показано ниже,

SELECT * FROM employee WHERE experience LIKE '>=3%'; 

Я знаю, что оператор сравнения не поддерживает строку, но у меня нет никакого нового решения для этого, есть ли какое-либо решение?

лучший ответ на основе преобразования в число:

select * from employee where cast(substring(experience, 1, instr(experience, '-')-1) as signed) >= 3;

 mysql> select cast(substring('11-3', 1, instr('11-3', '-')-1) as signed); +------------------------------------------------------------+ | cast(substring('11-3', 1, instr('11-3', '-')-1) as signed) | +------------------------------------------------------------+ | 11 | +------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('11-3', 1, instr('11-3', '-')-1) as signed) > 3; +----------------------------------------------------------------+ | cast(substring('11-3', 1, instr('11-3', '-')-1) as signed) > 3 | +----------------------------------------------------------------+ | 1 | +----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('11-3', 1, instr('11-3', '-')-1) as signed) >= 3; +-----------------------------------------------------------------+ | cast(substring('11-3', 1, instr('11-3', '-')-1) as signed) >= 3 | +-----------------------------------------------------------------+ | 1 | +-----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('3-0', 1, instr('3-0', '-')-1) as signed) >= 3; +---------------------------------------------------------------+ | cast(substring('3-0', 1, instr('3-0', '-')-1) as signed) >= 3 | +---------------------------------------------------------------+ | 1 | +---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('2-11', 1, instr('2-11', '-')-1) as signed) >= 3; +-----------------------------------------------------------------+ | cast(substring('2-11', 1, instr('2-11', '-')-1) as signed) >= 3 | +-----------------------------------------------------------------+ | 0 | +-----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('22-11', 1, instr('22-11', '-')-1) as signed) >= 3; +-------------------------------------------------------------------+ | cast(substring('22-11', 1, instr('22-11', '-')-1) as signed) >= 3 | +-------------------------------------------------------------------+ | 1 | +-------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select cast(substring('11-0', 1, instr('11-0', '-')-1) as signed) >= 3; +-----------------------------------------------------------------+ | cast(substring('11-0', 1, instr('11-0', '-')-1) as signed) >= 3 | +-----------------------------------------------------------------+ | 1 | +-----------------------------------------------------------------+ 1 row in set (0.00 sec) 

unsigned , вероятно, будет лучше для удобочитаемости. вероятно, не повлияет на запрос.

 Select * from main where cast(split_str(experience, '-', 1) as unsigned) >= 3; 

split_str (это пользовательская функция: http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/ , а не по умолчанию в mysql) разделит вашу колонку с ее разделителем, и приведение будет повернуто ваша строка в int unsigned, тогда вы можете ее протестировать. Иначе, если в один прекрасный день вы захотите испытать месяцы и годы, как и весь опыт выше 3-го и 10-ти месяцев, вы можете преобразовать свою ценность в десятичную (это также работает для теста выше):

 Select * from main where cast(replace(experience, '-', '.') As decimal(5,2)) > 3.10; 

Возможно, я сделал некоторые опечатки (набрав на смартфон), но у вас есть идея.

как насчет strcmp для этого простого случая? это не сработает, если вам понадобится как год, так и месяц.

 mysql> select strcmp('3-','3-1'); +--------------------+ | strcmp('3-','3-1') | +--------------------+ | -1 | +--------------------+ 1 row in set (0.00 sec) mysql> select strcmp('3-','3-9'); +--------------------+ | strcmp('3-','3-9') | +--------------------+ | -1 | +--------------------+ 1 row in set (0.00 sec) mysql> select strcmp('3-','2-9'); +--------------------+ | strcmp('3-','2-9') | +--------------------+ | 1 | +--------------------+ 1 row in set (0.00 sec) 

вы используете это в запросе следующим образом:

 mysql> select * from main where strcmp('ab', url) = 1; +----+---------------+ | id | url | +----+---------------+ | 1 | a.com | | 2 | aa.com | | 3 | aaa.com | | 4 | aachen.com | | 5 | aah.com | | 6 | aaliyah.com | | 7 | aaliyahs.com | | 8 | aardvark.com | | 9 | aardvarks.com | | 10 | aaron.com | | 11 | aas.com | +----+---------------+ 11 rows in set (0.02 sec) 

поэтому в вашем случае вам нужно что-то вроде select * from employee where strcmp('3-', experience) = -1;

если бы я был администратором db, и если упомянутый experience означает годы на этой задаче, я бы хотел, чтобы я только что использовал временные метки для начала и конца, поэтому его можно было легко вычислить. иначе каждый месяц пакетное задание должно будет обновить поле.

см. http://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#function_strcmp

[ОБНОВЛЕНИЕ: исправлено для случаев от 11 до 29-, проверяя, если часть лет в строке больше одной цифры]

select * from employee where strcmp('3-', experience) = -1 or instr(experience, '-') > 2;