我偶然发现了之前提出并回答的问题:How to use comparison operator for numeric string in mysql?
我绝对同意最好的答案。但是当我试图创建自己的答案时,它给我留下了一个问题。我试图选择第一个数字并将其转换为整数。接下来我想将该整数与数字进行比较(如果是问题则为3)。
这是我创建的查询:
SELECT experience,CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER) AS num FROM employee WHERE @num >= 3;
为简单起见,假设experience
内的数据为:4-8
查询不会返回任何错误。但它也没有返回数据。我知道可以将列内的数据与用户定义的变量进行比较。但是有可能将数据(在这种情况下为整数)与我试图做的变量进行比较吗?
这纯粹是出于好奇和学习的东西。
答案 0 :(得分:1)
AS num
指令将convert
的结果命名为num
,而不是名为@num
的变量。
你可以重复转换
SELECT experience,CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER)
FROM employee
WHERE CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER) >= 3;
或使用部分(派生)表格(只有一个convert
)
SELECT experience,num
FROM (select experience,
CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER) as num
FROM employee) as partialtable WHERE num>=3;
答案 1 :(得分:1)
是的,派生表可以。下面的内部选择块是派生表。每个派生表都需要一个名称。就我而言,xDerived
。
策略是让派生表清除列名的使用。来自派生块的是一个名为num
的干净列,外部选择可以自由使用。
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');
select id,experience,num
from
( SELECT id,experience,
CONVERT(SUBSTRING_INDEX(experience,'-',1),UNSIGNED INTEGER) AS num
FROM employee
) xDerived
where num>=7;
+----+------------+------+
| id | experience | num |
+----+------------+------+
| 2 | 7-1 | 7 |
| 5 | 8-6 | 8 |
| 7 | 10-4 | 10 |
+----+------------+------+
请注意,您的@num
概念有问题,但希望我能解释您上面的意图。
另外,我选择了7而不是3,因为你的所有样本数据都会返回,我想告诉你它会起作用。
答案 2 :(得分:0)
更简单。 (或至少要短得多。)这将适用于所描述的数据,即“数字, - ,其他东西”。
SELECT experience,
0+experience AS 'FirstPart'
FROM employee
WHERE 0+experience >= 3
为什么呢? 0+string
被解析为“将字符串转换为数字,然后将其添加到0”。转换字符串会将数字提取到第一个非数字,然后将其转换为数字。