我真的很想知道是否有可能做一个select语句,它返回完全相同的记录,我们放入 in 子句中?
样品:
select * from table
where table_id in (1, 2, 3, 666);
这个例子的表只有1到100的id-s,所以这个select只返回三行。我需要做什么,为666获得一个(可能是空的或虚拟的)行?
谢谢!
答案 0 :(得分:2)
您可以选择没有表格
用你的查询做一个UNION
select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
答案 1 :(得分:2)
你可以使用union:
select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;
是如何在Oracle中完成的。 from dual
可能会因您使用的数据库系统而异。
请注意,如果您使用union,您的虚拟查询必须选择与真实查询相同的记录。
答案 2 :(得分:1)
假设一个表numbers
包含从1到1000000的所有数字(事实上足以涵盖您的输入值范围),您可以运行以下SQL:
SELECT *
FROM numbers left outer join table on table.table_id = numbers.number
WHERE numbers.number in (1, 2, 3, 666)
如果您使用提供更好解决方案的DBMS,例如e。 G。 SQL Anywhere及其sa_rowgenerator过程,您可以使用过程调用替换表numbers
,并且没有最大数量的限制。
答案 3 :(得分:1)
IN
子句是一个布尔谓词,因此您需要将其替换为虚拟记录集:
SELECT m.*
FROM (
SELECT 1 AS id
UNION ALL
SELECT 2 AS id
UNION ALL
SELECT 3 AS id
UNION ALL
SELECT 666 AS id
) q
LEFT JOIN
mytable m
ON m.id = q.id
在SQL Server 2008
中,您可以运行此查询:
SELECT *
FROM @mydata d
LEFT JOIN
mytable t
ON t.id = d.id
带有@mydate
的是一个表变量,作为参数从客户端传递。
在PostgreSQL
中,您可以运行此查询:
SELECT *
FROM (
SELECT :arr[s] AS id
FROM generate_series(1, array_upper(:arr, 1)) s
) q
LEFT JOIN
mytable t
ON t.id = q.id
其中:arr
是数组[1, 2, 3, 666]
,也是从客户端传递的参数。
在Oracle
中,您可以执行以下操作:
SELECT *
FROM TABLE(:mycol) q
LEFT JOIN
mytable t
ON t.id = q.id
,其中:mycol
是集合类型的变量,从客户端传递。
答案 4 :(得分:0)
考虑它的一种方法是:您需要将该数据作为数据集“输入”查询。在where子句中找不到的数据永远不会“添加”到查询中,它们仅用于过滤现有数据。
一个简单的例子:
DECLARE @MustInclude (Value int not null)
INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)
SELECT *
from @MustInclude mi
left outer join MyTable mt
on mt.Value = mi.Value