如何在包含以逗号分隔的字符串值的列上使用Order By子句?

时间:2013-08-13 06:40:10

标签: sql sql-server-2012 sql-order-by

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

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

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

6 个答案:

答案 0 :(得分:2)

您应使用一个属性来存储多个值。这违背了DB原则。

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

SELECT 
  * 
FROM 
  employees 
  LEFT JOIN employees_skills 
    ON employee.id=employees_skills.employee_id 
WHERE 
  employees_skills='JavaScript'

答案 1 :(得分:1)

select EmpID, Skills
from Table1
order by case when Skills like '%JavaScript%' then 0 else 1 end

答案 2 :(得分:1)

试试这个

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

DEMO

OR

SELECT * FROM #MyTable
ORDER BY CASE WHEN Skills LIKE '%JavaScript%' THEN 0 ELSE 1 END,EmpID

答案 3 :(得分:0)

试试这个:

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

但这是一种糟糕的方式。你应该真正规范你的桌子。

答案 4 :(得分:0)

对于MySQL

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

等等

对于SQL Server

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

确保从1启动SQL服务器(我不确定)。 在结束前加入一个将显示所有剩余结果的其他内容。

有关SQL Server see thissee this

的详细信息

答案 5 :(得分: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