数据库取值的sql语句

数据库取值的sql语句,第1张

--建立测试表

tableA

(type=“书籍”的不足100条),tableB

(type=“书籍”的多于100条)

create

table

tableA(id

int

identity(1,1),type

nvarchar(8))

create

table

tableB(id

int

identity(1,1),type

nvarchar(8))

go

--向表tableA循环插入测试语句

declare

@a

int

set

@a=0

while

(@a<120)

begin

if

@a<20

insert

into

tableA(type)values('报刊')--20本是'报刊'

else

if

@a<40

insert

into

tableA(type)values('光盘')--20本是'光盘'

else

if

@a<60

insert

into

tableA(type)values('漫画')--20本是'漫画'

else

if

@a<80

insert

into

tableA(type)values('书籍')--20本是'书籍'

else

if

@a<100

insert

into

tableA(type)values('其它')--20本是'其它'

else

insert

into

tableA(type)values('杂志')--20本是'杂志'

set

@a=@a+1

end

go

--向表tableB循环插入测试语句

declare

@b

int

set

@b=0

while

(@b<120)

begin

insert

into

tableB(type)values('书籍')--全部是'书籍'

set

@b=@b+1

end

go

--查看表tableA,tableB中的数据

select

*

from

tableA

select

*

from

tableB

/************************查看你要看的的数据************************/

--方法一,用

charindex

函数(当然函数里面的顺序可以根据自己要求改变)

select

top

100

*

from

tableA

order

by

charindex(type,'书籍报刊漫画杂志光盘其它')

--方法二,如果在不想用函数可以同一楼一样用下面的方法

select

top

100

*

from

tableA

order

by

case

when

type='书籍'

then

1

when

type='报刊'

then

2

else

3

end

--tableB表同上

--查看完后删除测试表

drop

table

tableA

drop

table

tableB

数据我已经测试过了,没问题

最后求赏~~

----首先定义一个split函数,其作用是将字符串拆分成表CREATE FUNCTION [fn_split](@SourceSql varchar(8000), @StrSeprate varchar(10))RETURNS @temp table(  [n] int NULL,  [a] varchar(100) NULL)ASBEGINdeclare @i int,@n int  set @n=0  set @SourceSql=rtrim(ltrim(@SourceSql))  set @i=charindex(@StrSeprate,@SourceSql)  while (@i>=1)  begin    set @n=@n+1    insert @temp([n],[a]) values(@n,left(@SourceSql,@i-1))    set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)    set @i=charindex(@StrSeprate,@SourceSql)  end  if (@SourceSql<>'')  begin    set @n=@n+1    insert @temp([n],[a]) values(@n,@SourceSql)  end    returnENDGO --接下来利用这个函数将数组转化成表,查出A的对应值declare @C varchar(100),@D varchar(100)set @C='a1,a2,a3,a4,a5,a6'set @D='b1,b2,b3,b4,b5,b6'declare @A varchar(10),@B varchar(10)set @A='a4'select @B=t2.a from fn_split(@C,',') t1,fn_split(@D,',') t2 where t1.n=t2.n and t1.a=@Aselect @B--这里将得到@B=b4

--接下来就可以使用@B了select TOP 7 * from Data_Content where title = @B  order BY ID DESC

substring参数使用不正确,很明显,错误也在提示你这个原因!

substring一共要三个参数,第一个为要截的字符,第二个为字符串截取的起始位置,最后一个为要截取的长度!

很明显你要截取的字符串是@content,

起始位置为@spaceindex1+len(@text1),

长度为@spaceindex2-@spaceindex1-len(@text1)

这几个值你写的都是正确的,但我们必须要考虑一些意外情况!

varchar与nvarchar两者之间的区别!还有就是查找不到的情况!比如你输入的错了一个字符,那么就会导致@spaceindex1与@spaceindex2都为0第一个式子还好说,而第二个,也就是说长度会变为负值,而substring就会报错!

所以我们不妨先测试一下@spaceindex2的值,若为0时,则直接让其等于len(@content),这样如果查不到由直接返回整个字串,当然如果是@spaceindex1不为0时,还可以照样截取.

另一种情况也是你程序中常出现的错误!

set

@spaceindex2=charindex(@text2,@content)如果反过来了,也是得到的负值的.好在charindex支持第三个参数!

set

@spaceindex2=charindex(@text2,@content,@spaceindex1+1)

这样做的目的是保证@spaceindex2大于@spaceindex1,否则照出现错误!为了杜绝重复引起的错误,最好是

set

@spaceindex2=charindex(@text2,@content,@spaceindex1+1+len(@text1))

这样保证了@spaceindex2-len(@text1)也大于@spaceindex1

最后的那个varchar与nvarchar两者的区别,建议你如果处理有中文最好用nvarchar,因为这两个在统计长度是不至于出错的!

我想你最终的程序,应该是好修改的吧?


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9862696.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存