Sql 选择列中具有特定值的记录
我试图在其中一列中选择具有特定值的记录。考虑下面的例子:Sql 选择列中具有特定值的记录,sql,oracle,Sql,Oracle,我试图在其中一列中选择具有特定值的记录。考虑下面的例子: NAME VALUETEST rec1 val1 rec2 val1 rec3 val1 rec1 test123 rec1 test1234 rec2 test1234 这里我只希望选择那些valuetest列值为val1、test123和test1234的记录,即rec1。我尝试了下面简单的select查询,但它没有给我想要的结果 查询:select*from-temp,其中valuete
NAME VALUETEST
rec1 val1
rec2 val1
rec3 val1
rec1 test123
rec1 test1234
rec2 test1234
这里我只希望选择那些valuetest列值为val1、test123和test1234的记录,即rec1。我尝试了下面简单的select查询,但它没有给我想要的结果
查询:
select*from-temp,其中valuetest=all('val1','test123','test1234')代码>此查询是否提供了所需的结果
select *
from temp
where valuetest in ('val1', 'test123', 'test1234');
从中valuetest所在的临时位置选择*('val1'、'test123'、'test1234')
或者用可以用的
选择*from temp,其中valuetest=ANY('val1','test123','test1234')
使用Any代替All,因为对于All,它试图匹配单个记录的所有三个值我怀疑这就是您想要的:
select name from temp where valuetest = 'val1'
intersect
select name from temp where valuetest = 'test123'
intersect
select name from temp where valuetest = 'test1234'
若要从表中选择的列不止是名称,请运行:
select * from temp where name in(
select name from temp where valuetest = 'val1'
intersect
select name from temp where valuetest = 'test123'
intersect
select name from temp where valuetest = 'test1234')
这应该做到:
SELECT name, COUNT(*)
FROM temp
WHERE valuetest IN ('val1','test123','test1234')
GROUP BY name
HAVING COUNT(*) = 3;
它将检索所有与val1
、test123
和test1234
匹配的NAME
s
如果您实际上需要所有行,而不仅仅是名称,则应使用连接
:
SELECT *
FROM temp
INNER JOIN (
SELECT name, COUNT(*)
FROM temp
WHERE valuetest IN ('val1','test123','test1234')
GROUP BY name
HAVING COUNT(*) = 3
) USING(name);
此外,无论条件中的值有多少('val1'、'test123'、'test1234'、…
),这种方法都只会扫描表两次。您的答案会给出包含任何一个值test的所有记录,然而,我只需要那些具有所有3个valuetest值的记录。您的答案为我提供了所有具有任何一个valuetest值的记录,而我只需要那些具有所有3个valuetest值的记录。但它将从每个名称中删除所有具有所有3个值的其他行,并且可能会引起兴趣。诚然,问题中没有给出多少细节,但这是一个限制。我同意,但考虑到上下文,唯一感兴趣的价值似乎是NAME
。无论哪种方式,我的查询都可以很容易地调整以适应此请求。谢谢你指出这一点(我更新了我的答案)。谢谢你的答案。你的答案似乎给了我正确的结果,但我想知道我的查询出了什么问题?一个值不能同时是X、Y和Z。但是,单个值可以高于或低于X、Y和Z。通常使用ALL/ANY。查看另一种查看方法:您希望表中的“name”值至少在一行上有一个valuetest值,该值在另一行(不相同的行)上为“X”,“Y”,在另一行(不相同的行)上为“Z”。我已经编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。