請問這種情況sql語句如何寫



這是Access數據庫 

name_A,name_B,name_C都是由多個name組成分別用逗號加空格隔開。   

1.       name_A   和   name_B中都有的table1       的記錄   (下面是別人告訴我的答案,可以用) 
select * from table1 where instr(', '+name_b+', ',', 你你, ')>0 and instr(', '+name_a+', ',', 你你, ')>0


2.       name_A中有而name_B中沒有的table1       的記錄   (請告訴我,如何用上面同樣的方法改成滿足這個需要的sql語句) 


3.       name_A   和   name_C中都有的table1       的記錄   (下面是別人告訴我的答案,可以用) 
select * from table1 t1 inner join table2 t2 on t1.id=t2.table1_id and instr(', '+name_a+', ',', '+t2.name_c+', ')>0 where t2.name_c='444'


4.       name_A中有而name_C中沒有的table1       的記錄   (請告訴我,如何用上面同樣的方法改成滿足這個需要的sql語句) 


還有,我不想改變數據形式

8 个解决方案

#1


2.
select   *   from   table1   where   instr(',   '+name_b+',   ',',   你你,   ')> 0   and   instr(',   '+name_a+',   ',',   你你,   ')= 0 

#2


4.
select   *   from   table1   t1   inner   join   table2   t2   on   t1.id=t2.table1_id   and   instr(',   '+name_a+',   ',',   '+t2.name_c+',   ')= 0   where   t2.name_c='444'

#3



--問題二:
select * from table1 where instr(','+name_b+',',',你你,')=0 and instr(','+name_a+',',',你你,')> 0
--問題四:
select * from table1 t1 inner join table2 t2 on t1.id=t2.table1_id and instr(','+name_a+',',','+t2.name_c+',')= 0 where t2.name_a='444'
 

#4


其實樓主就是不理解 instr函數的意義,在baidu上查一下 instr函數,了解他的意義,比找到本問題的答案更重要.
------------------------------------------------------------------------------------------
上面的語句樓主說可以用的,其實是不行的,如果做一點稍微復雜的測試就會發現問題:
比如,你查"你你",和你查"你你你"的結果可能是一樣的,這就是 instr函數的局限.

------------------------------------------------------------------------------------------
如果想徹底解決這個問題,必須用sql數據庫,寫一個自定義函數,或者在頁面代碼里面寫一個函數.
把檢索出來的數據集數據用split函數分解,然后遍歷匹配.
------------------------------------------------------------------------------------------
寫一個存在交集的例子,可能手誤,拋磚引玉function split_str(a,b)
ary_a=spilt(a,",")
ary_b=split(b,",")
spilt_str=0 '設置函數初始返回0,如果真確,返回1
for i=0 to ubound(ary_a)
for k=0 to ubound(ary_b)
if ary_a(i)=ary_b(k) then
spilt_str=1
exit function
end if
next
next
end function

#5


上面手誤:
function   split_str(a,b) 
ary_a=spilt(a,",")
ary_b=split(b,",")
spilt_str=0 '設置函數初始返回0,如果真確,返回1
for i=0 to ubound(ary_a)
for k=0 to ubound(ary_b)
if ary_a(i)=ary_b(k) then
spilt_str=1
exit function
end if
next
next
end function

#6


那我再問一個問題,

5.name_A和name_B中都有而name_C中沒有的table1的記錄     
6.name_A和name_B,name_C三個中都有的table1的記錄  

#7


beyondamane 
你寫的這個函數可一用在sql語句中嗎?

#8


instr 可以改成like,mssql中也可以用charindex.
解決這個問題的關鍵在於把已有字段構造成更有利的字段進行查詢
比如字段內容:444, 你你, 我我==>, 444, 你你, 我我, 
需要查詢的內容:你你==>, 你你, 
             444==>, 444, 
這樣做查詢就會相對簡單而准確,是沒有問題的,4#的沒有理解清楚.

access 中的instr跟vbs中的instr用法雷同
InStr([start, ]string1, string2[, compare])
InStr 函數的語法有以下參數:

參數 描述 
start 可選。數值表達式,用於設置每次搜索的開始位置。如果省略,將從第一個字符的位置開始搜索。如果 start 包含 Null,則會出現錯誤。如果已指定 compare,則必須要有 start 參數。 
string1 必選。接受搜索的字符串表達式。 
string2 必選。要搜索的字符串表達式。 
compare 可選。指示在計算子字符串時使用的比較類型的數值。有關數值,請參閱“設置”部分。如果省略,將執行二進制比較。 


設置
compare 參數可以有以下值:
常數 值 描述 
vbBinaryCompare 0 執行二進制比較。 
vbTextCompare 1 執行文本比較。 


返回值
InStr 函數返回以下值:
如果 InStr 返回 
string1 為零長度 0 
string1 為 Null Null 
string2 為零長度 start 
string2 為 Null Null 
string2 沒有找到 0 
在 string1 中找到 string2 找到匹配字符串的位置 
start > Len(string2) 0 


說明
下面的示例利用 InStr 搜索字符串: 
Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP"            ' 要在其中搜索的字符串。
SearchChar = "P"                        ' 搜索 "P"。

'文本比較從第四個字符開始返回 6。
MyPos = Instr(4, SearchString, SearchChar, 1)   

'二進制比較從第1個字符開始返回 9。
MyPos = Instr(1, SearchString, SearchChar, 0)

' 缺省為二進制比較(最后一個參數省略)。
MyPos = Instr(SearchString, SearchChar)    ' 返回 9。

' 二進制比較從第1個字符開始返回 0 (沒有找到 "W")。
MyPos = Instr(1, SearchString, "W")        


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com