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

Sql 如何在包含以逗号分隔的字符串值的列上使用ORDERBY子句?,sql,sql-server-2012,sql-order-by,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的员工进行排序,我如何才能得到这个结果?您应该而不是使用一个属性来存储多个值。这违背了我们的原则 相反,您

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

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

因此,我想写一个查询,首先对所有知道
JavaScript
的员工进行排序,我如何才能得到这个结果?

您应该而不是使用一个属性来存储多个值。这违背了我们的原则

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

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

您不应该使用一个属性来存储多个值。这违背了我们的原则

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

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

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

试试这个

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

试试这个:

 SELECT *
 FROM YourTable
 ORDER BY PATINDEX('%JavaScript%', Skills) DESC 
但这是一种糟糕的方式。您应该真正规范化您的表。

尝试以下方法:

 SELECT *
 FROM YourTable
 ORDER BY PATINDEX('%JavaScript%', Skills) DESC 
但这是一种糟糕的方式。您应该真正规范化您的表。

对于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 server(我不确定)。 在结束前包含一个else,它将显示所有剩余结果

有关SQL Server或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 server(我不确定)。 在结束前包含一个else,它将显示所有剩余结果


有关SQL Server或

的更多详细信息,请参见适用于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    

这适用于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    

我想要所有的行,但是由那些首先了解java脚本的员工排序。我想要所有的行,但是由那些首先了解java脚本的员工排序。如果可能的话,最好重新设计模式,将这些单独的值存储在单独的行中。如果可能的话,最好重新设计模式,将这些单独的值存储在单独的行中。