我有一个名为列的表,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 EmpID, Skills
from Table1
order by case when Skills like '%JavaScript%' then 0 else 1 end
尝试这个
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
尝试这个:
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 服务器
select Skills from myTable
order by case
when Skills="Javascript" then 1
when Skill="Java" then 2
else 3
end
确保从 1 启动 SQL 服务器(我不确定)。在 end 之前包含一个 else ,它将显示所有剩余的结果。
这适用于 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