如何比较mysql中的用户集变量?

时间:2015-12-25 05:40:20

标签: mysql

我偶然发现了之前提出并回答的问题: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

查询不会返回任何错误。但它也没有返回数据。我知道可以将列内的数据与用户定义的变量进行比较。但是有可能将数据(在这种情况下为整数)与我试图做的变量进行比较吗?

这纯粹是出于好奇和学习的东西。

3 个答案:

答案 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”。转换字符串会将数字提取到第一个非数字,然后将其转换为数字。