1

我真的很想知道是否可以执行一个 select 语句,它返回完全相同的记录,我们放入in子句?

样本:

select * from table
where table_id in (1, 2, 3, 666);

这个例子的表只有从 1 到 100 的 id-s,所以这个选择将只返回三行。我需要做什么,才能为 666 获得一个(可能为空或虚拟)行?

谢谢!

4

5 回答 5

2

您可以在没有表格的情况下进行选择

只需对您的查询进行 UNION

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
于 2010-08-27T14:06:47.837 回答
2

你可以使用联合:

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可能会因您使用的数据库系统而异。

请注意,如果您使用联合,您的虚拟查询必须选择与真实查询相同的记录。

于 2010-08-27T14:08:32.500 回答
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,例如带有sa_rowgenerator过程的 SQL Anywhere,您可以用过程调用替换表numbers,并且没有最大数量的限制。

于 2010-08-27T14:06:24.500 回答
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

with@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是集合类型的变量,从客户端传递。

于 2010-08-27T14:20:59.957 回答
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
于 2010-08-27T14:06:54.950 回答