我正在SQL Server中编写不同的查询。
我有两张表,Employees
和Departments
。表Employees
由EMPLOYEE_ID
、ENAME
、ID_DEP
组成。表Departments
由ID_DEP
、DNAME
组成。任务是显示Employee.ENAME
和他的Department.DNAME
,其中Department.DNAME
包含单词Sales
。我必须使用函数SUBSTRING
和PATINDEX
。
这是我的代码,但我认为它看起来很奇怪,毫无意义。然而,我需要在这项任务中使用这两个函数。
SELECT e.ENAME, d.DNAME
FROM EMPLOYEE e
JOIN DEPARTMENTS d ON d.ID_DEP = e.ID_DEP
WHERE UPPER(SUBSTRING(d.DNAME, (PATINDEX('%SALES%', d.DNAME)), 5)) = 'SALES'
在继续使用这两个函数时,我应该更改什么?
答案就在下面,顺便说一句,使用行构造函数VALUES是获得所需内容的简单演示的绝佳方法。
下面的查询为您模棱两可的问题提供了几种可能的答案。为什么需要使用这些功能?是家庭作业指定的吗?如果SQL Server数据库安装了不区分大小写的排序规则,或者列"name"设置为此排序规则,则无论如何使用UPPER,匹配都不会有任何差异。UPPER的最大作用是使数据在结果中显示为大写,或者在更新列时将数据变为大写。PATINDEX/LIKE将执行不区分大小写的匹配。你知道,这是非常有用的,以至于大多数人都用一些不区分大小写的排序规则来配置他们的服务器。要避免与列/数据库排序规则匹配的默认比较行为,请指定collate子句,如Test2的外部应用中所示。
以下是查询。看看结果,它们显示了我所说的。
select *
From
(Values ('très sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)
outer apply (Select Test1='match' Where Substring(name, patindex('%SALES%', name), 5) = 'SALES') as test1
outer apply (Select Test2='match' Where name COLLATE Latin1_General_CS_AS like '%SALES%' ) as test2 -- CS_AS mean case sensitive
outer apply (Select Test3='match' Where name like '%SALES%') as test3
select * -- really want an upper case match ?
From
(Values ('très sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)
Where name COLLATE Latin1_General_CS_AS like '%SALES%'
select * -- demo of patindex
From
(Values ('très sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)
outer apply (Select ReallyUpperMatch=name Where patindex('%SALES%', name COLLATE Latin1_General_CS_AS)>0 ) as ReallyUpperMatch -- CI_AS mean case sensitive
outer apply (Select ciMatch=name Where name like '%SALES%' ) as ciMatch
outer apply (Select MakeItLookUpper=UPPER(ciMatch) ) MakeItLookUpper