在sql查詢中根據已知id的集合來查詢結果我們通常會用到in,直接在in後面給出id的集合或是在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 functionsplit
(
@sourcesql
varchar
(8000),
@strseprate
varchar
(10)
)returns
@temp
table
(f1
varchar
(100))
asbegin
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查詢中根據已知id的集合來查詢結果我們通常會用到in,直接在in後面給出id的集合或是在in後面跟乙個子查詢。如下 select from orders where orderguid in bc71d821 9e25 47da bf5e 009822a3fc1d f2212304 51d4...
在sp executesql中使用like字句
在sp executesql中可以執行引數化的sql,但是如果sql中有like,那麼一般都要拼字串,下面的例子把兩者結合了起來,既有拼sql的靈活性,又有引數化sql的優點。declare likesql nvarchar 32 定義乙個like變數,如果是儲存過程,此處可以儲存過程的引數 set...
在sp executesql中使用like字句
在sp executesql中可以執行引數化的sql,但是如果sql中有like,那麼一般都要拼字串,下面的例子把兩者結合了起來,既有拼sql的靈活性,又有引數化sql的優點。declare likesql nvarchar 32 定義乙個like變數,如果是儲存過程,此處可以儲存過程的引數 set...