如何在查询中使用AND参数使用AND参数

时间:2016-05-26 05:20:20

标签: mysql sql-server oracle oracle-sqldeveloper

我有一个oracle查询,它有几个参数,其中一个参数就像一个数组,参数名称例如:COLOR。假设我有一个桌子人物

 ID    NAME   WARECOLOR
 12   Sabrina   red
 12   Sabrina   blue
 32   Mark      blue
 45   Bob       red 
 25   Lean      white
 01   Sara      Orange

我想在两个不同的查询中以两种方式使用此参数,一个使用OR条件,另一个使用AND条件。假设我想要所有拥有“红色或蓝色”的名字 如果我将参数发送到:COLORS为

|red|blue|

并编写此查询

SELECT ID, NAME, COLOR
FROM PEOPLE
WHERE  INSTR(:COLORS, COLORS) > 0
GROUP ID, NAME, COLOR;

结果如下:

 ID    NAME   WARECOLOR
 12   Sabrina   red
 12   Sabrina   blue
 32   Mark      blue
 45   Bob       red 

哪个好,但我的问题是:我怎么能用它来做条件? 就像我想要所有拥有“红色和蓝色”的名字一样,这意味着结果应该是:

 ID    NAME   WARECOLOR
 12   Sabrina   red
 12   Sabrina   blue

可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

要找到这些人,您可以:

SELECT ID, NAME
FROM PEOPLE
WHERE  INSTR(:COLORS, WARECOLOR) > 0
GROUP ID, NAME
HAVING COUNT(*) = regexp_count(:COLORS,'[|]') - 1 ;

regexp_count(:COLORS,'[|]')只计算|来自:COLORS。 如果您的表格未正确规范(您有重复项),则可以使用count(distinct WARECOLOR)代替count(*)

然后获取行很简单:

SELECT ID, NAME, COLOR
FROM PEOPLE
WHERE  id, name in (
    SELECT ID, NAME
    FROM PEOPLE
    WHERE  INSTR(:COLORS, WARECOLOR) > 0
    GROUP ID, NAME
    HAVING COUNT(*) = regexp_count(:COLORS,'[|]') - 1 ;
 )
;

答案 1 :(得分:0)

您可以在 SQL Server 开发环境中尝试以下SQL脚本。 我使用用户定义的函数dbo.split()来split input string using SQL

/*create table colorTbl (
ID int,   NAME   varchar(10), WARECOLOR varchar(10)
)
insert into colorTbl select 12,'Sabrina','red'
insert into colorTbl select 12   ,'Sabrina','blue'
insert into colorTbl select  32   ,'Mark','blue'
insert into colorTbl select  45   ,'Bob','red' 
insert into colorTbl select  25   ,'Lean','white'
insert into colorTbl select  01   ,'Sara','Orange'*/

declare @color varchar(max) = '|red|blue|'

;with cte as (
    select val, COUNT(*) over (partition by 1) cnt1
    from dbo.Split(@color,'|')
    where val <> ''
)
select * 
from (
select *, COUNT(*) over (partition by name) cnt2
from colorTbl c
inner join cte on c.warecolor = cte.val
) t where cnt1 = cnt2

split函数返回每种颜色的颜色和订单号。 这使您可以知道输入参数的计数。 使用SQL Count() function with Partition By子句可以计算每个用户匹配颜色的行。 当我匹配这两个计数值时,您将为连接的参数值实现AND。