SQL Server:使用PATINDEX函数查找子字符串

Kev*_*vin 6 sql-server substring patindex

我正在 SQL Server 中编写不同的查询。

我有 2 张桌子,Employees并且Departments. 表EmployeesEMPLOYEE_ID, ENAME, ID_DEP- 部门 ID 组成。表由,Departments组成。任务是显示他的内容在哪里。我必须使用函数和.ID_DEPDNAMEEmployee.ENAMEDepartment.DNAMEDepartment.DNAMESalesSUBSTRINGPATINDEX

这是我的代码,但我认为它看起来很奇怪并且毫无意义。尽管如此,我需要在此任务中使用这两个函数。

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'
Run Code Online (Sandbox Code Playgroud)

在继续使用这两个功能的同时我应该改变什么?

Mau*_*hat 1

答案就在下面,顺便说一句,使用行构造函数 VALUES 是获得所需内容的简单演示的绝佳方法。

\n

下面的查询为您的模棱两可的问题提供了几种可能的答案。为什么需要使用这些功能?这是指定这一点的作业吗?如果您的 SQL Server 数据库安装了不区分大小写的排序规则,或者列“名称”设置为该排序规则,则无论如何使用 UPPER,匹配都不会产生任何差异。您最多可以使用 UPPER 使数据在结果中显示为大写,或者在更新列时将数据变为大写。PATINDEX/LIKE 将执行不区分大小写的匹配。你知道,这非常有用,以至于大多数人都使用某种不区分大小写的排序规则来配置他们的服务器。要避免与列/数据库排序规则匹配的默认比较行为,请指定 collat​​e 子句,如 Test2 的外部 apply 中所示。

\n

以下是查询。观察结果,它们显示了我所说的。

\n
select *\nFrom\n  (Values ('tr\xc3\xa8s sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)\n  outer apply (Select Test1='match' Where Substring(name, patindex('%SALES%', name), 5) = 'SALES') as test1\n  outer apply (Select Test2='match' Where name COLLATE Latin1_General_CS_AS like '%SALES%' ) as test2 -- CS_AS mean case sensitive\n  outer apply (Select Test3='match' Where name like '%SALES%') as test3\n\nselect * -- really want an upper case match ?\nFrom\n  (Values ('tr\xc3\xa8s sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)\nWhere name COLLATE Latin1_General_CS_AS like '%SALES%'\n\nselect * -- demo of patindex\nFrom\n  (Values ('tr\xc3\xa8s sales'), ('TRES SALES'), ('PLUTOT PROPRE')) as d(name)\n  outer apply (Select ReallyUpperMatch=name Where patindex('%SALES%', name COLLATE Latin1_General_CS_AS)>0 ) as ReallyUpperMatch -- CI_AS mean case sensitive\n  outer apply (Select ciMatch=name Where name like '%SALES%' ) as ciMatch\n  outer apply (Select MakeItLookUpper=UPPER(ciMatch) ) MakeItLookUpper\n
Run Code Online (Sandbox Code Playgroud)\n