1首先,个人认为你的这个表设计不是很合理,范式高一点的话,水箱有一个基础信息表,水q有一个基础信息表,然后俩者有一个关系中间表,这算标准模式吧
再说即使按这种冗余设计的话,你也别把一个水箱对应的多个水q搞一个字符保存数据吧,这个怎么看怎么别扭比如你1号水箱对应了 1,3,4这3个水q, 不要想着一条数据记录这种一对多的关系简单,变成1-1,1-3,1-4这样3条记录,也就不用这样痛苦了
2,既然你都这么干了,我提供一下解决办法吧,我对CHARINDEX() 这个函数用得少,但是大概看了一下,但是和你用的方式用的方式有点不一样,看你放不方便用了
--首先使用CHARINDEX() 这个函数做一个分割函数,该函数只负责切割
--字符分割函数
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100))
returns @temp table(F1 varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return
end
----调用select from dbof_splitstr('1,3,4',',')
你会得到1,3,4这样的一个结果集
---然后就好办了,你需要的东西变成了下面这样
--select sum(WR_WEIGHT) from TBL_WATER_RECORD where WR_GUN_NUMBER in(
-- select from dbof_splitst(
-- select WC_GUN_NUM from TBL_WATERCAN where WC_WATERCAN_NUM = 1,',')
--)
--本来到这里就结束了,但是这里引发了另外一个问题,上面这句在f_splitst函数中直接使用子查询,
--貌似有查询优先级的问题,它没有先查询出结果
--而是把这句子查询做为一个参数传入了f_splitst,所以行不通
--那么就使用参数结构吧,最后就变成这样了
declare @gun_num as varchar(1000)
select @gun_num=WC_GUN_NUM from TBL_WATERCAN where WC_WATERCAN_NUM= 1
select sum(WR_WEIGHT) from TBL_WATER_RECORD where WR_GUN_NUMBER in(
select from dbof_splitstr(@gun_num,',')
)
--说真的,这次我被恶心了一次,感觉这不是最优的解决办法吧,但是勉强能用吧,不想伤神了
1:可以利用CHARINDEX(或者 PATINDEX) 函数返回字符或者字符串在另一个字符串中的起始位置。 SELECT CHARINDEX('ad','rrdadgff') 返回4; 2:可以利用like进行模糊查询, like ‘%字符串%’ 3:利用全文索引
CHARINDEX ( expression1 , expression2 , [ start_location ] )
如果没有最后一个参数,那么找到的是第一个;
如果要找第二个,那么要从第一个后面的位置开始查找;
如果要查找全部,则需要使用循环语句。
patindex函数支持使用通配符,能够用在很多有变化的查找中。而charindex不能够
比如
patindex(%[a,z,0-9]%[a,z,0-9]%[a,z,0-9]%,xyzabc123)
以上就是关于关于SQLSERVER中 SUM() CHARINDEX() 等的现实案例问题,求帮助全部的内容,包括:关于SQLSERVER中 SUM() CHARINDEX() 等的现实案例问题,求帮助、如何用sql语句,判断数据库中某字段的内容,包含于某字符串、Sql 中 CHARINDEX 包含多个或关系的字符串等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)