日期:2014-05-18  浏览次数:20335 次

根据字符串查询的问题
问一个SQL的问题:

我有个表,里面有个字段   f_deptpath   ,有个记录是这样的:
\\-1\21\2,\\-1\21\4,  

我现在要根据一些特别的字符串来查找到这条记录,如果是   \\-1\21\2\5\6就可以查到这个记录,同一,\\-1\21\4\3\2也可以查到这个记录,\\-1\21\5\1就没有办法找到这条记录

就是说,这个字段内容里面,如果有个字符串里面有这个字段内容里面以,分割的内容,就可以查到  

说清楚一点就是:
  我有个表,是一个记录企业公告的表,因为企业公告要针对部门或职位的,所以,我在表里增加了两个字段,一个是接受公告的部门列表,一个是接受公告的职位列表,都是以“,”分割的,
比如,   管理部门的路径是“\\-1\2”,生产部门的路径是“\\-1\3”,那么,表示管理部门和生产部门是同一级的,如果我要发送公告给管理部门和生产部门,那么,字段部门列表的内容就是“\\-1\2,\\-1\3,”,   我所属的部门是仓库,部门路径是 "\\-1\2\5\6 ",表示我是属于生产部门下的资材部门下的仓库,
因为以上的公告是发给生产部的,所以,作为生产部的下属子部门,我是可以接收这个公告的,怎么通过查询来完成这个动作。


------解决方案--------------------
沙发
------解决方案--------------------
可以考虑使用 SELECT * FROM TableName WHERE 字段+ '\ ' LIKE '%\部门编号\% '

------解决方案--------------------
不太了解你部门表的结构和公告部门列表的结构,但可以考虑使用自定义函数来实现,先以逗号分割,再是\\和\.
按道理是可以实现,只是对于数据量很大的情况,速度就很说了.


------解决方案--------------------
建分隔函数:
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+ 'a ')-2
WHILE CHARINDEX(@split,@s)> 0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen, ' ')
END
INSERT @re VALUES(@s)
RETURN
END
GO
f_splitSTR( '\\-1\21\2,\\-1\21\4, ', '\\-1\21\ ')
按\\-1\21\分隔,f_deptpath 为2,4,
f_splitSTR(f_splitSTR( '\\-1\21\2\5\6 ', '\\-1\21\ '), '\ ')

按\\-1\21\分隔\\-1\21\2\5\6为2\5\6再按\分隔为2 5 6



------解决方案--------------------
部门表:
id
父部门
部门名称

公告表
id
接受部门 部门id+‘,’+部门id,以,分割

用户表
id
部门id
按照第1个表设计,是可以根据一个公告去查相应的部门的.
参考方法:
1.先提取上级部门:
SELECT * FROM 部门表 WHERE 部门ID IN(公告表) ---这里使用动态SQL语句来完成,得到的结果可以先写入临时表.
2.使用替归的方法找临时表里所有的下级部门.(最大层为32层)



------解决方案--------------------
SELECT * FROM 部门表 WHERE 部门ID IN(公告表)这句我不理解,我的接受部门是以,分隔的,怎么查?

如:
DECLARE @Exec_Sql nvarchar(4000)
SET @Exec_Sql= 'SELECT 部门ID FROM 部门表 '
SELECT @Exec_Sql=@Exec_Sql+ 'WHERE 部门ID IN ( '+[接受部门]+ ') ' FROM 公告表 WHERE ...
EXECUTE(@Exec_Sql)

要是楼主能重新设计公告表结构,那是更好了,免了很多技术难题,这样最好不过。

------解决方案--------------------
D