0

我有一个名为列的表,Skills其中包含不同员工的逗号分隔值,例如

EmpID  Skills
 1     C,C++,Oracle
 2     Java,JavaScript,PHP
 3     C,C++,Oracle
 4     JavaScript,C++,ASP
 5     C,C++,JavaScript

所以我想写一个查询,它将首先订购所有知道的员工JavaScript,我怎样才能得到这个结果?

4

6 回答 6

2

您不应该使用一个属性来存储多个值。这违反了关系数据库原则。

取而代之的是,您应该创建额外的表来存储技能并在其中引用员工。然后,您的查询将如下所示:

SELECT 
  * 
FROM 
  employees 
  LEFT JOIN employees_skills 
    ON employee.id=employees_skills.employee_id 
WHERE 
  employees_skills='JavaScript'
于 2013-08-13T06:44:59.213 回答
1
select EmpID, Skills
from Table1
order by case when Skills like '%JavaScript%' then 0 else 1 end
于 2013-08-13T06:45:10.573 回答
1

尝试这个

SELECT *
FROM 
(
    SELECT *
        ,CASE WHEN Skills LIKE '%JavaScript%' THEN 0 ELSE 1 END AS Rnk 
    FROM MyTable
) T
ORDER BY rnk,EmpID

演示

或者

SELECT * FROM #MyTable
ORDER BY CASE WHEN Skills LIKE '%JavaScript%' THEN 0 ELSE 1 END,EmpID
于 2013-08-13T06:45:45.120 回答
0

尝试这个:

 SELECT *
 FROM YourTable
 ORDER BY PATINDEX('%JavaScript%', Skills) DESC 

但这是一个不好的方法。你真的应该标准化你的桌子。

于 2013-08-13T06:46:18.637 回答
0

对于 MySQL

select Skills from myTable 
order by case Skills 
when "Javascript" then 0 
when "Java" then 1 when "C++" then 2
end

等等

对于 SQL 服务器

select Skills from myTable 
order by case 
when Skills="Javascript" then 1
when Skill="Java" then 2
else 3 
end

确保从 1 启动 SQL 服务器(我不确定)。在 end 之前包含一个 else ,它将显示所有剩余的结果。

有关 SQL Server 的更多详细信息,请参阅此参阅此

于 2013-08-13T06:49:25.360 回答
0

这适用于 DB2/400:

with s (id, skill, rest) as                       
    (select id, '', sk from skills                    
     union all                                        
     select id, substr(rest, 1, locate(',',rest)-1),  
                substr(rest,locate(',',rest)+1)      
     from       s                                    
     where      locate(',',rest) > 0)                
select id, skill from s                           
where  skill = 'JavaScript'                       
order by id    
于 2013-08-13T08:35:54.443 回答