SQL service,LIKE多对象

SELECT *FROM UCML_Organize WHERE ClassCode LIKE '%'+@OID+'%'

一般用like实现模糊查询,大概就这样写吧!

但是,@OID万一不是一个值了?而是多个值了,那么我们应该去怎么写了。

我当时想的,是不是like后面可以加一个in来了。想了想,sql也没这种写法呀。果不其然报错了!

SELECT *FROM UCML_Organize WHERE ClassCode LIKE IN('%'+@OID+'%')

后面想到了那就用OR条件来写吧,也就是这样将多个值用OR一直连起来。

SELECT *FROM UCML_Organize WHERE ClassCode LIKE '%'+@OID+'%' OR ClassCode LIKE '%'+@OID+'%'
OR ClassCode LIKE '%'+@OID+'%'

先把它给拼接起来

SELECT STUFF((SELECT 'OR ClassCode LIKE ''' +  ClassCode+'%''  ' FROM UCML_Organize FOR XML PATH('')),1,2,'')

这一段查询出来的结果就是这个样子

到这里当时我就想直接将 图一where后面的条件直接给换成这个一段也就是这样

SELECT *FROM UCML_Organize WHERE STUFF((SELECT 'OR ClassCode LIKE ''' +  ClassCode+'%''  ' FROM UCML_Organize FOR XML PATH('')),1,2,'')

然后它给报错了,如下图

 后面发现它其实是   SELECT *FROM UCML_Organize WHERE ''的形式的。查询出来的那一段还是字符格式。前端倒是直接可以用eval来解决。数据库不行呀,只有用exec(字符串)来执行。

因此就想将where条件后面的OR那一堆条件给查询出来,然后把前面那一段sql变成字符串。最后

再把两端给拼接起来在用exe来执行就好了。

--sql1装基础语句
declare @sql1 nvarchar(1000)
--sql2根据动态生成的or条件后缀
declare @sql2 nvarchar(1000)
--获取不属于该单位类型的最底层单位,及部门
declare @sql3 nvarchar(max)
--最终执行的存储过程语句
declare @sqlMAX nvarchar(max)
set @sql1='SELECT CONVERT(VARCHAR(50),UCML_OrganizeOID)+'','' FROM UCML_Organize WHERE (';
set @sql2=(SELECT STUFF((SELECT 'OR ClassCode LIKE ''' +  ClassCode+'%''  ' FROM UCML_Organize WHERE ORG_FLG=1 AND UCML_OrganizeOID NOT IN(SELECT ParentOID FROM UCML_Organize WHERE ORG_FLG=1)
AND UCML_OrganizeOID NOT IN(SELECT SYS_ORG FROM BBTB_DWJBXX WHERE DWSSLX=@DWLX) FOR XML PATH('')),1,2,''))
set @sql3=@sql1+@sql2+') FOR XML PATH('''')'
exec(sql3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值