问个关于SQL语句的问题,应该不是很难

fs822 2010-07-08 11:48:59
SQL怎么检索标签?

比如这个数据库

BookID bookTag
1 "小说|悬疑|促销"
2 "经商|人物传记"
3 "立志|人物传记|促销"

现在搜索关键字 "促销|立志",怎么把3号ID搜索出来?

要求是一个"|"对应一个标签,搜索关键字中要所有标签都出现,才显示对应结果
(如1号中有“小说”标签,搜索关键字中没有此标签,就不显示)。而先后顺序不影响搜索结果。

怎么用SQL写?谢谢大家了。




'如果描述不是很清楚的话可以参考这段VB代码,返回书的标签是否符合搜索标签
Function matchTag(ByVal bookTag As String, ByVal searchTag As String) As Boolean
Dim bookT, searchT, found As Boolean
bookT = Split(bookTag, "|")
'把书本的标签根据“|”分割成数组
searchT = Split(searchTag, "|")
'把搜索的标签根据“|”分割成数组

For i = 0 To UBound(searchT)
'遍历一遍搜索的标签,寻找图书关键字中是否有匹配的标签
found = False
'初始值为没有找到
For j = 0 To UBound(bookT)
'遍历一遍图书的标签
If (bookT(j) = searchT(i)) Then
'匹配图书的标签和搜索的标签
found = True: Exit For
'找到了,跳过当前For,继续匹配下一个搜索标签
End If
Next
If (Not (found)) Then matchTag = False: Exit Function
'要是没有找到就返回false
Next
matchTag = True: Exit Function
'执行到这一步说明全部找到,返回True
End Function

...全文
54 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fs822 2010-07-08
  • 打赏
  • 举报
回复
明白 谢谢
ACMAIN_CHM 2010-07-08
  • 打赏
  • 举报
回复
VB中你可以用split把 "促销|立志“ 拆分到数组中,然后对这个数据循环生成 instr(bookTag,”促销“) and instr((bookTag,”立志") and ...
fs822 2010-07-08
  • 打赏
  • 举报
回复
谢谢上面的回答了,试试看
fs822 2010-07-08
  • 打赏
  • 举报
回复
原来是这样写的
rs.open "select * from bookTable",db,1,3
while not(rs.eof)
if(matchTag(rs("booktag"),request("searchTag"))) then
response.write("图书编号:" & rs("BookID") & "<br>")
end if
rs.movenext
wend

但觉得速度慢点,而且内存占用多,有没有等价高效的算法?
ACMAIN_CHM 2010-07-08
  • 打赏
  • 举报
回复
ACCESS的JET-SQL中不支持正则表达式,无法仅通过SQL语句来实现你要求的这个功能。直接先通过程序VB代码把 "促销|立志“拆分为 ”促销“ 、”立志" 然后生成SQL语句 select * from xxxx where instr(bookTag,”促销“) and instr((bookTag,”立志")

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧