如何编写tsql请求(转换问题)?
我有两张桌子: 表合同:如何编写tsql请求(转换问题)?,tsql,Tsql,我有两张桌子: 表合同: IdContract | Department | IdCompany ----------------------------------------------------- 154 | 6 | /1150/1420/879/ 和表公司: IdCompany | WorkingIdDepartment ------------------------------------- 11
IdContract | Department | IdCompany
-----------------------------------------------------
154 | 6 | /1150/1420/879/
和表公司:
IdCompany | WorkingIdDepartment
-------------------------------------
1150 | /17/8/26/
出于某种原因,一些公司被错误地分配给了一些合同:他们是第6部门的合同,但他们只在第17、8和26部门工作。我需要找到那些公司
我尝试通过以下方式请求我的数据库:
SELECT *
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/1150/%')
AND ct.Department NOT IN (17,8,26)
或者以动态的方式:
SELECT *
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/' , cp.IdCompany , '/%')
AND ct.Department NOT IN (Right(Left(Replace(WorkingIdDepartment, '/', ','), len(Replace(WorkingIdDepartment, '/', ',')) - 1), len(Left(Replace(WorkingIdDepartment, '/', ','), len(Replace(WorkingIdDepartment, '/', ',')) - 1))-1))
但是我的错误是我请求的最后一部分,请给我一个字符串:“17,8,26”,而不是几个用coma分隔的Int。。。因此,我得到了转换错误(我不会在这里复制/粘贴我的错误,因为它是法语)
请问我怎样才能达到我的要求
感谢您的帮助!解决方案是:
SELECT *
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/' , cp.IdCompany , '/%')
AND ct.Department NOT IN (SELECT value from STRING_SPLIT(WorkingIdDepartment, '/'))
这是非常“消耗性能”“但它适用于我的数据库糟糕的设计看起来真正的问题在于你的设计。为什么要存储分隔数据?你应该把它修好。#我知道。。。这是一个将在2020年重新编写的旧应用程序,但遗憾的是,在此之前我必须处理它……这些值是分层的还是用作“安全”分隔符?你不能只是用
,
替换它,然后让进入
运行<中的代码>可用于值列表,而不是看起来像列表的单个值。如果/
只是一个分隔符,请在SQL Server 2016+中使用字符串分割
,或多种字符串分割技术(如XML技术)中的一种,将这些值读取为行。如果值表示层次结构,则可以将其转换为层次结构ID
,并轻松执行层次结构查询。但是,您发布的查询没有层次结构。您使用的是哪个SQL Server版本?即使使用STRING\u SPLIT
查询也会很复杂-您需要将分隔的合同字段拆分为行,然后在ID值上与公司合并。