SQLserver 怎么把查出的字符串结果作为子查询条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLserver 怎么把查出的字符串结果作为子查询条件相关的知识,希望对你有一定的参考价值。

--例如:A表中有U_NO字段,B表中也有U_NO字段,A表中唯一一条记录U_NO字段的数据是001,002,003 --怎么通过A表U_NO的记录来查B表中U_NO in(001,002,003)的记录?

我先说下思路,等下可以详细讲
第一种方法你可以用一个自定义的分隔函数(表值函数)去得到001,002,003的三行记录

方法二:你可以逆向处理,如
select * from B
where (select top 1 A.U_NO+',' from A) like B.U_NO+','
加','是为了不会匹配错误
附上一个字符串分隔函数:
create function Split(@STR varchar(max),@Separator varchar(1000))
RETURNS @T TABLE(ID varchar(1000))
begin
if(len(@Separator)=0)
set @Separator=','
DECLARE @TName VARCHAR(1000)
SELECT @STR=RTRIM(@STR)+@Separator
WHILE CHARINDEX(@Separator,@STR)>0
BEGIN
SELECT @TName=LEFT(@STR,CHARINDEX(@Separator,@STR)-1)
SELECT @STR=STUFF(@STR,1,CHARINDEX(@Separator,@STR),'')
insert into @T(ID)values(@TName)
END
RETURN
end
go追问

有简单点的方法么

追答

你看这样可以吗
select * from B
where charindex(B.U_NO+',', (select top 1 A.U_NO+',' from A))>=0

追问

把>=改为=就行了。你真聪明,谢谢

参考技术A select * from b where u_no in(select u_no from a )追问

select u_no from a结果是一个字符串。、、

追答

这句sql的意思是b表中和a表中u_no相同的所有数据,不可能是一个字符串

追问

抱歉让你理解错了,A表中的U_NO是(001,002,003)是以逗号分隔的字符串
而B表的数据是001或002或003
你那写法就是‘001,002,003’='001'||‘001,002,003’='002'||‘001,002,003’='003'

追答

哦,这样啊,那就得写sqlserver函数了。1楼正解。

参考技术B join追问

要怎么join呢?

Jmeter将JDBC Request查询结果作为下一个接口参数方法

现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口。

tieba_info表结构如下图

技术图片

 

分析:

1.要查出username和count(*),那么首先就要有1个或者2个 jdbc request,连接本地数据看,分别查询出我们需要的username和count(*);

2.rank小于某个值,这个值我们可以做一个变量,方便管理。不管这个值是多少,我们查出来的count(*)将只有一个值,而username会有很多个,具体多少根据我们的条件rank来变化;

3.查询出所有username后,我怎么取到每一个username的值?

4.又怎么把我们查出来的每一个username作为参数值去请求下一个接口?这里先说下,需要做一个循环。

5.我事先并不知道能查出多少条数据,那如何知道我们需要循环多少次?

 

接下来逐一解决我们的问题。

 

实践:

1.首先添加一个jdbc connection configuration,这里的配置方法可以百度,我连接的是我本地的mysql数据库

技术图片

 

2.添加1个或者2个 jdbc request,分别查询username和 count(*),我这里是用了两个

技术图片

技术图片

 

3.可以看到,在username这个请求中,select语句中出现了变量rank,那我们可以添加一个【用户定义的变量】,名称就是我们的sql语句里面的变量引用名rank,值就根据需要自己填

技术图片

 

4.sql语句写完了,就要提取我们需要的结果了

这个时候可以添加查看结果树,看看我们获取到的count(*)和username

 

count查出来的数据如下图:

技术图片

 

username查询出来的数据如下

技术图片

那我们需要的就是这个count(*)就是20,和20个username的值

 

 

5.上面我们只是查出来数据,接下来我们就要提取username和count(*)数据,再回到我们的count和username jdbc request

 

在username这个request里面,下方的 variable name这里填上你想使用的变量名,也就是之后的接口中要用到的,我取的username,同理,count的request里也做相同操作,可以取为count

技术图片

 

技术图片

 

6.现在我们要测试我们的参数化到底成功没有,我模拟请求接口localhost:3306/test,然后参数传count和username,参数值就是我们获取的username和count(*)

技术图片

 

查看下请求结果

技术图片

我发现请求里面 username和count参数化并没有成功,那为什么会不成功呢,经过一番搜索,原来当使用jdbc request的结果作为参数时,要写成${username_1}这样子,1代表你查出来的数据第一行,想取第几行就把1改成几。那问题来了,我们查出来count(*)是肯定只有一条数据,那我们可以确定写成${count_1},但是username却有很多条,我是想所有的username都请求一次,也就是说如果是username这个变量的话,1这个数字应该是要不断变化的而不是某个固定的值,那怎么才能让他不断变化呢

 

7.计数器

对,就是计数器

我们添加一个计数器

技术图片

由于我们从第一行开始取值,所以启动填1,每次我们多1,所以递增也填1,最大值可不填,number format就是数字格式,如果填000,取值是12,那最后会显示为012,而我们只需要本身的数字,所以就填0,引用名称就是后面需要用的变量名

 

8.有了计数器,能递增了,那我们就能把username传进去了。我们上面说了${username_1}是取第一行,${username_2}是取第二行,依次类推,那我们要从1开始取,一直到最后。上一步添加的计数器就起作用了,我们设置的计数器是从1开始计数,每次递增1,那么跟我们想要的完全吻合,index就是我们设置的计数器的变量名,可以直接用他来代替我们的数字1,2,3,4等等,那我们现在来把username和index两个变量拼接起来,这里如果你直接写成 ${username_index}或者 ${username_${index}}都是不行的,因为两个变量不能直接拼接,需要用到一个函数 __V,不了解这个函数的可以百度看看,作用就是可以使2个变量可以拼在一起,所以我们拼接后的username变量应该是${__V(username_${index})}

技术图片

 

现在再来看看 我们请求接口有没有把所有的username传进去

技术图片

 

结果发现,为啥还是只请求了一次,明明count(*)查出来是20,那应该请求20次啊,为啥只把第一个username传进去了呢?

 

9.这是因为,我们传的username参数相当于做了参数化,有多个值,这时候就需要在设置线程数或者添加一个循环控制器,但是我们并不知道到底需要循环多少次或者需要设置多少线程数,才能让username刚好传完,这个时候,我们之前查询的count就起作用了,count变量是我们之前查出来的所有数据的总数,这个总数是多少就说明我们需要多少线程或多少次循环。ok,那我们在http 请求上右击,点击插入上级--逻辑控制器--循环控制器,循环次数,我们使用count变量,即${count_1},这样就能把次数确定。这里其实不能用添加线程的方式来做,因为count 和 username两个jdbc request都在这个线程里,如果设置多线程,这两个也会多次请求,不合理,所以我们选择更好的循环控制器

技术图片

 

10.所有的东西都设置完了,就需要把我们的东西进行重新排序归类

我们首先是有jdbc connection config,然后有count和username两个jdbc request,然后我们有一个测试的http请求,一个计数器和一个循环控制器,那么这时候就需要把计数器和http请求全部移入循环控制器了,否则还是无法传入全部username值

最后的效果如图,rank变量值是20,刚好20个http请求,每个请求的username都不同

技术图片

 

以上是关于SQLserver 怎么把查出的字符串结果作为子查询条件的主要内容,如果未能解决你的问题,请参考以下文章

急!sqlserver查询结果按句号换行符

如何把oracle中查询出来的一列进行拆分。如查出结果为1@2@3@4,如何拆分成 1 2 3

MySQL中0'0'作为条件时的区别

从数据库中查出两列数据,返回的是一个hashmap,怎么把其中的一列作为显示值一列作为value,数据库是oracle

Oracle - 子查询TOP - N

sqlserver数据库里怎么查找一个表里的约束,要查出 约束名、列名、约束类型?用sql语句查询