带有伪行的SQL in子句

带有伪行的SQL in子句,sql,in-clause,dummy-data,Sql,In Clause,Dummy Data,我真的很想知道是否有可能做一个select语句,它返回与我们放入子句中的完全相同的记录 样本: select * from table where table_id in (1, 2, 3, 666); 例如,此表只有1到100之间的id-s,因此此选择仅返回三行。我需要做什么,为666获得一行(可能是空的或伪的) 谢谢 假设一个表numbers包含从(比如)1到1000000的所有数字(事实上足以覆盖您的输入值范围),您可以运行以下SQL: SELECT * FROM numbers l

我真的很想知道是否有可能做一个select语句,它返回与我们放入子句中的完全相同的记录

样本:

select * from table
where table_id in (1, 2, 3, 666);
例如,此表只有1到100之间的id-s,因此此选择仅返回三行。我需要做什么,为666获得一行(可能是空的或伪的)


谢谢

假设一个表
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。GSQL Anywhere使用它的过程,您可以用过程调用替换表
数字
,并且没有最大数字的限制。

假设一个表
数字
包含从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及其过程,您可以用过程调用替换表
编号,并且没有最大编号的限制。

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

只需对您的查询进行联合

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

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

只需对您的查询进行联合

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

一种考虑方法是:您需要将该数据作为数据集“输入”查询。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

一种考虑方法是:您需要将该数据作为数据集“输入”查询。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
您可以使用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;
这就是你如何在甲骨文中做到这一点。根据您使用的数据库系统的不同,dual的
可能会有所不同

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

可以使用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;
这就是你如何在甲骨文中做到这一点。根据您使用的数据库系统的不同,dual的
可能会有所不同


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

子句中的
是一个布尔谓词,因此需要用虚拟记录集替换它:

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
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
with
@mydate
是一个表变量,作为参数从客户端传递

PostgreSQL
中,您可以运行以下查询:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id
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

,其中
:mycl
是一个集合类型的变量,从客户端传递。
子句中的
是一个布尔谓词,因此需要将其替换为一个伪记录集:

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
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
with
@mydate
是一个表变量,作为参数从客户端传递

PostgreSQL
中,您可以运行以下查询:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id
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
是一个从客户端传递的集合类型变量。

这将一直有效,直到他需要一个不在
numbers.number
中的伪值为止。是的,这是一个限制-至少对许多DBMS来说是这样,但是e。GSQLAnywhere提供了一个带有系统过程的解决方案。我把它添加到我的答案中。直到他需要一个不在
numbers.number
中的虚拟值时,这才起作用。是的,这是一个限制-至少对许多DBMS来说是这样,但e。GSQLAnywhere提供了一个带有系统过程的解决方案。我把它添加到我的答案中。你的解决方案要求你在定义语句时知道哪些值在表中,哪些不在表中。@Frank:如果你想以编程方式设置虚拟列表,你可以使用动态SQL来构建它,但是OP谈论它的方式,在我看来,他们似乎已经知道了什么是需要提前成为假人的。但是,是的,我想这可能需要一些澄清。你的解决方案要求你在定义语句时知道哪些值在表中,哪些不在表中。@Frank:如果你想以编程方式设置虚拟列表,你可以使用动态SQL来构建它,但是OP谈论它的方式,在我看来,他们似乎已经知道了什么是需要提前成为假人的。但我想这需要澄清一下。