在SQL查询中使用LIKE来代替IN查询的方法
2011-08-31 00:00
846 查看
如下:
可以看出直接在IN后面跟ID的集合需要将每一个ID都用单引号引起来。在实际应用中会遇到这么一种情况,在界面中收集的是一串GUID的拼接字符串,中间以逗号隔开,如果作为参数传到一个存储过程中执行,最终生成的语句会是下面这样:
这样就不能查询到正确的结果。
一般情况下我们解决此问题的思路是将传入的字符串用一个split函数来处理,最终处理的结果是一张表,然后将这个表做自查询即可,如下:
当然split函数系统比不提供,需要我们自己写:
像这样做非常麻烦,而且还需要借助函数来实现,下面介绍一种简单的方法,因为GUID是唯一的,所以在上面的例子中可以使用LIKE来代替IN也可以达到同样的查询效果:
SELECT * FROM Orders WHERE OrderGUID IN('BC71D821-9E25-47DA-BF5E-009822A3FC1D','F2212304-51D4-42C9-AD35-5586A822258E')
可以看出直接在IN后面跟ID的集合需要将每一个ID都用单引号引起来。在实际应用中会遇到这么一种情况,在界面中收集的是一串GUID的拼接字符串,中间以逗号隔开,如果作为参数传到一个存储过程中执行,最终生成的语句会是下面这样:
SELECT * FROM Orders WHERE OrderGUID IN('BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E')
这样就不能查询到正确的结果。
一般情况下我们解决此问题的思路是将传入的字符串用一个split函数来处理,最终处理的结果是一张表,然后将这个表做自查询即可,如下:
DECLARE @IDs VARCHAR(4000) SET @IDs='BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E' DECLARE @temp TABLE(str VARCHAR(50)) INSERT INTO @temp SELECT * FROM dbo.Split(@IDs,',') SELECT * FROM Orders WHERE OrderGUID IN (SELECT str FROM @temp)
当然split函数系统比不提供,需要我们自己写:
CREATE FUNCTION Split ( @SourceSql varchar(8000), @StrSeprate varchar(10) ) RETURNS @temp TABLE(F1 VARCHAR(100)) AS BEGIN DECLARE @i INT SET @SourceSql=rtrim(ltrim(@SourceSql)) SET @i=charindex(@StrSeprate,@SourceSql) WHILE @i>=1 BEGIN INSERT @temp VALUES(left(@SourceSql,@i-1)) SET @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) SET @i=charindex(@StrSeprate,@SourceSql) END IF @SourceSql<>'' INSERT @temp VALUES(@SourceSql) RETURN END
像这样做非常麻烦,而且还需要借助函数来实现,下面介绍一种简单的方法,因为GUID是唯一的,所以在上面的例子中可以使用LIKE来代替IN也可以达到同样的查询效果:
SELECT * FROM Orders WHERE 'BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E' LIKE '%'+convert(VARCHAR(40),OrderGUID)+'%'
相关文章推荐
- 在SQL查询中使用LIKE来代替IN查询的方法
- 在SQL查询中使用LIKE来代替IN
- 在SQL查询中使用LIKE来代替IN
- SQL语句中find_in_set、like、in的区别及使用方法
- 解决yii框架中,使用参数化查询时,IN只能查询一个的代替方法
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- sql语句中一种可以代替like查询语句的效率较高的查询关键字的方法
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- Delphi模糊查询[ POS函数和Like SQL语句 ]使用方法
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- ThinkPHP3.2.3中,查询语句中in的使用方法。
- SQL高级应用之使用SQL查询Excel表格数据的方法
- sql语句中条件查询in、like、=的效率
- 移动文章分类的sql语句,查询并更新同一个表的方法 You can't specify target table 'news_articles' for update in FROM clause
- 使用in关键字来限制SQL语句中的select查询结果
- SQL多条件查询拼接in中条件方法
- SQL查询语句通配符与ACCESS模糊查询like的解决方法