又是SQL,好怕,自己基础又薄弱,只有再次请教高手了,谢谢.表一:
id sortid
10 亚洲
11 欧洲
12 美洲表二:
id srotid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
103 11 A-003 3; 3;
104 11 A-004 4; 3;4;表三:
id text1 text2
1 aaa;bbb; ccc;ddd;
2 eee;fff; ggg;hhh;
现在假如客户输入"亚洲 aaa"我要搜索出以下纪录:(注:因为arr1与arr2里面含有记录表三中的含有"aaa"的ID号,此例表三中含有"aaa"的ID号为1。对了,还需要考虑模糊搜索.)id srotid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
再次谢谢了.
id sortid
10 亚洲
11 欧洲
12 美洲表二:
id srotid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
103 11 A-003 3; 3;
104 11 A-004 4; 3;4;表三:
id text1 text2
1 aaa;bbb; ccc;ddd;
2 eee;fff; ggg;hhh;
现在假如客户输入"亚洲 aaa"我要搜索出以下纪录:(注:因为arr1与arr2里面含有记录表三中的含有"aaa"的ID号,此例表三中含有"aaa"的ID号为1。对了,还需要考虑模糊搜索.)id srotid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
再次谢谢了.
没看明白这个和表3有什么关系
谢谢你呀,中午你刚把我解决了一个大难题。
这个下面显示的结果中的arr1、arr2里面所含有的1,就是表三中含有"aaa"的ID号。
id srotid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
from tb1 a,tb2 b,tb3 c
where a.id=b.srotid and
(';'+c.id like '%;'+b.arr1+';%' or ';'+c.id like '%;'+b.arr2+';%') and
a.sortid='亚洲' and
(';'+'aaa'+';' like '%;'+c.text1+';%' or ';'+'aaa'+';' like ''%;'+c.text2+';%')
Create Table 表一
(id Int,
sortid Nvarchar(10))
Insert 表一 Select 10, N'亚洲'
Union All Select 11, N'欧洲'
Union All Select 12, N'美洲'Create Table 表二
(id Int,
sortid Int,
name Varchar(10),
arr1 Varchar(20),
arr2 Varchar(20))
Insert 表二 Select 101, 10, 'A-001', '1;', '1;'
Union All Select 102, 10, 'A-002', '1;2;', '1;'
Union All Select 103, 11, 'A-003', '3;', '3;'
Union All Select 104, 11, 'A-004', '4;', '3;4;'Create Table 表三
(id Int,
text1 Varchar(20),
text2 Varchar(20))
Insert 表三 Select 1, 'aaa;bbb;', 'ccc;ddd;'
Union All Select 2, 'eee;fff;', 'ggg;hhh;'
GO
--测试
Select B.*
From 表一 A
Inner Join 表二 B On A.id = B.sortid
Inner Join 表三 C On (';' + B.arr1 Like '%;' + Cast(C.id As Varchar) + ';%') And (';' + B.arr2 Like '%;' + Cast(C.id As Varchar) + ';%')
Where A.sortid = N'亚洲' And (';' + C.text1 Like '%;' + 'aaa' + ';%' Or ';' + C.text2 Like '%;' + 'aaa' + ';%')
GO
--删除测试环境
Drop Table 表一, 表二, 表三
--结果
/*
id sortid name arr1 arr2
101 10 A-001 1; 1;
102 10 A-002 1;2; 1;
*/
'函数名:keyword_sousuo
'作 用:生成sql查询条件
'参 数:table_field ------ 表的字段名(之间用逗号分开)
' keyword ------ 搜索关键词(之间用空格分开)
'返 回:sql查询条件
'==================================================
function keyword_sousuo(byval table_field,byval keyword)
dim str01,str02,keywords,table_fields,i,j
table_fields=split(trim(table_field),",")
keywords=split(trim(keyword),",")
if table_field<>"" then
str01="("&table_fields(0)&" like '%"&keyword&"%'"
for j=0 to ubound(table_fields)
str01=str01&" or "&table_fields(j)&" like '%"&keyword&"%'"
next
str01=str01&")"
else
response.Write("<script>alert('参数错误(不能为空)!')</script>")
response.End()
end if
'全角--》半角 空格
'keyword=replace(keyword," "," ")
'while InStr(keyword," ")>0
' keyword=replace(keyword," "," ")
'wend
keywords=split(keyword," ")
if ubound(keywords)>0 then
for i=0 to ubound(keywords)
str02=str02&"("&table_fields(0)&" like '%"&keywords(i)&"%'"
for j=1 to ubound(table_fields)
str02=str02&" or "&table_fields(j)&" like '%"&keywords(i)&"%'"
next
str02=str02&")"
next
str02="("&replace(str02,")(",")and(")&")"
keyword_sousuo="(" & str01 & "or" & str02 & ")"
else
keyword_sousuo=str01
end if
end function
'================================================== '调用时用相关的字段传送过去就可以了;sql_where=keyword_sousuo("title,cz,name,time",keyword)
conn.Open ConnectString
rs.Open sql_where, conn, 1, 1谢谢您们!
找了N久,终于找到了这个支持模糊搜索的函数,试了一下感觉还不错.
现在有一个好大的问题,就是能否把我上面要求的SQL语句引入进来用.
偶从早上试到现在,看得头都晕了,还是不行.
没办法,只好再提出来,真的不想再烦大家了,有点过意不去,还请见谅.
谢谢.
'函数名:keyword_sousuo
'作 用:生成sql查询条件
'参 数:table_field ------ 表的字段名(之间用逗号分开)
' keyword ------ 搜索关键词(之间用空格分开)
'返 回:sql查询条件
'==================================================
function keyword_sousuo(byval table_field,byval keyword)
dim str01,str02,keywords,table_fields,i,j
table_fields=split(trim(table_field),",")
keywords=split(trim(keyword),",")
if table_field<>"" then
str01="("&table_fields(0)&" like '%"&keyword&"%'"
for j=0 to ubound(table_fields)
str01=str01&" or "&table_fields(j)&" like '%"&keyword&"%'"
next
str01=str01&")"
else
response.Write("<script>alert('参数错误(不能为空)!')</script>")
response.End()
end if
'全角--》半角 空格
'keyword=replace(keyword," "," ")
'while InStr(keyword," ")>0
' keyword=replace(keyword," "," ")
'wend
keywords=split(keyword," ")
if ubound(keywords)>0 then
for i=0 to ubound(keywords)
str02=str02&"("&table_fields(0)&" like '%"&keywords(i)&"%'"
for j=1 to ubound(table_fields)
str02=str02&" or "&table_fields(j)&" like '%"&keywords(i)&"%'"
next
str02=str02&")"
next
str02="("&replace(str02,")(",")and(")&")"
keyword_sousuo="(" & str01 & "or" & str02 & ")"
else
keyword_sousuo=str01
end if
end function
'================================================== '调用时用相关的字段传送过去就可以了;sql_where=keyword_sousuo("title,cz,name,time",keyword)
conn.Open ConnectString
rs.Open sql_where, conn, 1, 1谢谢您们!
找了N久,终于找到了这个支持模糊搜索的函数,试了一下感觉还不错.
现在有一个好大的问题,就是能否把我上面要求的SQL语句引入进来用.
偶从早上试到现在,看得头都晕了,还是不行.
没办法,只好再提出来,真的不想再烦大家了,有点过意不去,还请见谅.
谢谢.
select b.*
from 表一 a
inner join 表二 b on a.id=b.sortid
inner join 表三 c on charindex(cast(c.id as varchar),b.arr1)>0 and charindex(cast(c.id as varchar),b.arr2)>0
where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')---表二的arr1 arr2 两者只要有含表三的id的话
select b.*
from 表一 a
inner join 表二 b on a.id=b.sortid
inner join 表三 c on charindex(cast(c.id as varchar),b.arr1)>0 or charindex(cast(c.id as varchar),b.arr2)>0
where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')
where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')
你把aaa改成eee再试试看
我想你的设置不合理,建议用两个条件较合理些,如亚洲 下有aaa和bbb
输入亚洲aaa 这样的查询我没有做过
呵呵我觉得与你的数据库设置不太合理*/
条件1 条件2
亚洲 aaa
bbb
--------------
欧洲 ccc
ddd
-------------
美洲 eee
fff
我用这句来执行,为什么也有语法错误.
select b.*
from tb1 a,tb2 b,tb3 c
where a.id=b.srotid and
(';'+c.id like '%;'+b.arr1+';%' or ';'+c.id like '%;'+b.arr2+';%') and
a.sortid='亚洲' and
(';'+'aaa'+';' like '%;'+c.text1+';%' or ';'+'aaa'+';' like ''%;'+c.text2+';%')
from tb1 a,tb2 b,tb3 c
where a.id=b.srotid and
(';'+b.arr1+';' like '%;'+c.id+'%' or ';'+b.arr2+';' like '%;'+c.id+'%') and
a.sortid='亚洲' and
(';'+c.text1 like '%;'+'eee'+';%' or ';'+c.text2+';' like '%;'+'eee'+'%')
又提示这个:标准表达式中数据类型不匹配奇怪..55
这个不会提示这个错误,但是却找不到纪录,数据库里明明有存的.
您也早点休息了,明天有时间再来了,我也晕了一天了.
再试试看
From 表一 A
Inner Join 表二 B On A.id = B.sortid
Inner Join 表三 C On (';' + B.arr1 Like '*;' + Cast(C.id As Varchar) + ';*') Or (';' + B.arr2 Like '*;' + Cast(C.id As Varchar) + ';*')
Where A.sortid = N'亚洲' And (';' + C.text1 Like '*;' + 'aaa' + ';*' Or ';' + C.text2 Like '*;' + 'aaa' + ';*')
按LZ的意思,只有是ADO连接的
代码是不是在SQL,ACCESS,ORACLE里都可以通用吗?
肯定不行啊...