Oui, une table dérivée fera l'affaire. Le bloc de sélection interne ci-dessous est une table dérivée. Et chaque table dérivée a besoin d'un nom. Dans mon cas, xDerived
.
La stratégie consiste à laisser la table dérivée nettoyer l'utilisation du nom de la colonne. Sortant du morceau dérivé est une colonne propre nommée num
que la sélection externe est libre d'utiliser.
Schéma
create table employee
( id int auto_increment primary key,
experience varchar(20) not null
);
-- truncate table employee;
insert employee(experience) values
('4-5'),('7-1'),('4-1'),('6-5'),('8-6'),('5-9'),('10-4');
Requête
select id,experience,num
from
( SELECT id,experience,
CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER) AS num
FROM employee
) xDerived
where num>=7;
Résultats
+----+------------+------+
| id | experience | num |
+----+------------+------+
| 2 | 7-1 | 7 |
| 5 | 8-6 | 8 |
| 7 | 10-4 | 10 |
+----+------------+------+
Remarque, votre @num
le concept était défectueux mais j'espère que j'ai interprété ce que vous vouliez faire ci-dessus.
De plus, j'ai opté pour 7 et non 3, car tous vos exemples de données auraient été renvoyés, et je voulais vous montrer que cela fonctionnerait.