在SQL查詢中使用LIKE來代替IN

2021-09-08 01:55:47 字數 2487 閱讀 4401

在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 function 

split

(

@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...