一个难度sql查询

yooono 2006-07-13 02:48:21
一个数据库中的某一个字段存储了几个字段的内容:
字段 类型 值
a 字符串 hoho1
b 日期 2005-1-1
c int 90
...
这样本来是应该3个字段来存储的他把所有的值用特定字符分割后都放进了一个字符串类型的字段中:
如上存储成了a=.=hoho1;b=.=2005-1-1;c=.=90;
现在我如果不修改它的数据库怎么才能进行如下查询?
1、针对a的等于和包含:这个应该是用 字段 like %a=.=%值%吧
2、针对日期的:我想查询一个日期段内的数据该怎么查?
3、针对int:我想查询大于等于小于问题呢
高分期待高手...
呵呵不够俺还有点

...全文
468 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yooono 2006-07-17
  • 打赏
  • 举报
回复
恩,都给他,别人没意见吧
ldw701 2006-07-14
  • 打赏
  • 举报
回复
mark
xiangyanyan_1999 2006-07-13
  • 打赏
  • 举报
回复
楼主真要谢谢hellowork() 。我建议100分都应该给他。
xiangyanyan_1999 2006-07-13
  • 打赏
  • 举报
回复
hellowork() 厉害,厉害。我测试了。
hellowork 2006-07-13
  • 打赏
  • 举报
回复
declare @test table(k varchar(100))
insert @test
select 'a=.=hoho1;b=.=2005-1-1;c=.=90;' union all
select 'a=.=ahoh;b=.=2006-10-10;c=.=91;' union all
select 'a=.==ahoho1x;b=.=2007-1-1;c=.=99;'
----1.从k列中查询a的值
declare @query varchar(10)
----a)等于
set @query = 'ahoh'
select * from @test a where charindex('a=.=' + @query + ';',a.k) > 0
----b)包含
set @query = '=ahoh'
select * from @test a
where substring(a.k,charindex('a=.=',a.k) + 4,(charindex(';b=.=',a.k) - (charindex('a=.=',a.k) + 4)))
like '%' + @query + '%'
----2.从k列中查询b的值
select * from @test a
where cast(substring(a.k,charindex(';b=.=',a.k) + 5,(charindex(';c=.=',a.k) - (charindex(';b=.=',a.k) + 5))) as datetime)
between '2006-10-1' and '2007-12-31'
----3.从k列中查询c的值
declare @query3 int
set @query3 = 91
select * from @test a where cast(substring(a.k,charindex(';c=.=',a.k) + 5,len(a.k) - (charindex(';c=.=',a.k) + 5)) as int) >= @query3
LouisXIV 2006-07-13
  • 打赏
  • 举报
回复
就不会从原始表里查?
yooono 2006-07-13
  • 打赏
  • 举报
回复
做这个表的时候记录的数据本来不用查询的,现在又要查询了
yooono 2006-07-13
  • 打赏
  • 举报
回复
怀疑什么呀
LouisXIV 2006-07-13
  • 打赏
  • 举报
回复
不管你要实现怎么样的查询,做出这样的表的人值得怀疑某些东西
fcuandy 2006-07-13
  • 打赏
  • 举报
回复
如果a,b,c都包括,就是我上面写的那样,如果不完整,那就需要在查询时先检测是包含了哪些,再做处理,总之还是字符处理.
没有难度,只是写法烦琐.
yooono 2006-07-13
  • 打赏
  • 举报
回复
可能理解有误:
我的意思是把应该放在
字段 类型 值
a 字符串 hoho1
b 日期 2005-1-1
c int 90

这样的数据库存储的值存成数据库test了
字段 类型 值
k 字符串 a=.=hoho1;b=.=2005-1-1;c=.=90;
针对test应该怎么来查询

yooono 2006-07-13
  • 打赏
  • 举报
回复
abc并不是全部都有
yooono 2006-07-13
  • 打赏
  • 举报
回复
有不完整的
lovedick 2006-07-13
  • 打赏
  • 举报
回复
fcuandy 2006-07-13
  • 打赏
  • 举报
回复
1
SELECT * FROM tb WHERE 字段 LIKE 'a=.=%' + 值 + '%;b=.='
2
WHERE CAST(SUBSTRING(
SUTFF(字段,1,CHARINDEX(';',字段)+4,'')
,1
,CHARINDEX(';',
SUTFF(字段,1,CHARINDEX(';',字段)+4,'')
)-1
) AS DATETIME) BETWEEN DATEADD(dd,-1,起始时间) AND DATEADD(dd,1,结束时间)
3,太简单就不写了吧,还是字串处理。

上面随便打的,可能有手误
子陌红尘 2006-07-13
  • 打赏
  • 举报
回复
既然每个字段的值前面都是加上相同长度的前缀,把这些前缀去掉再转为相应的数据类型,处理起来会更方便一些,缺点就是如果列上创建了索引,则无法使用索引来提高查询效率。
zlp321002 2006-07-13
  • 打赏
  • 举报
回复
能保证都有a,b,c 的值吗??有没有不完整的情况??
子陌红尘 2006-07-13
  • 打赏
  • 举报
回复
select
*
from

where
stuff(a,1,4,'') like '%'+@value+'%'
and
cast(stuff(b,1,4,'') as datetime) between date1 and date2
and
cast(stuff(c,1,4,'') as int) > @num

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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