繁体   English   中英

SQL“In”语句匹配任何内容

[英]SQL “In” Statement Match Anything

如果我有这样的查询

SELECT * FROM table1 WHERE col1 IN ({SUBS})

有什么我可以替换{SUBS},它将返回表中的所有行?

更多详情:

我正在我的应用程序中动态构建SQL,所以我不能(不应该)编辑查询的其他部分,除了括号中的内容。 所以,

SELECT * FROM table1

不行。

也,

SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1)

将是hackish和非常低效。 考虑表有超过50k行。

这样做:

select col1 from table1

编辑:似乎有点混乱 - OP询问可以使用什么值来替换将返回table1所有行的{SUBS} 我上面的答案就是你可以使用什么代替返回所有行的{SUBS}

这适用于SQL Server:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN (COLUMN_NAME)

您是否尝试过将COL1用于{SUBS}

例如

SELECT * FROM table1 WHERE col1 IN (col1)

如果用SELECT col1 FROM table1替换{SUBS} ,你最终会得到

SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1);

这将返回table1所有行。 当然,这只是一种更为迂回的说法:

SELECT * FROM table1;

你是对的,

SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1)

确实有效,但效率很低; 需要合并连接才能返回所有行。

使用以下效果与常规SELECT * FROM table1一样高效

SELECT * FROM table1 WHERE col1 IN (col1)

但是,那说; 我建议您与试图强制使用SELECT * FROM table1 WHERE col1 IN ({SUBS})结构的人聊天。 没有充分的理由这样做。

  • 它不必要地使查询复杂化。
  • 创建高效低效查询的风险。
  • 可能甚至限制开发人员使用某些技术。

我怀疑强加于此的人正试图实施某种银弹框架。 请记住,软件开发的黄金法则没有 银子弹

如果您只是尝试检索表中的每一行,那么:

select * from table1

如果你想证明一个观点或赢得赌注或其他什么,那么:

select * from table1 where col1 in (select col1 from table1)

如果查询需要一些WHERE条件,那么我会尝试用EXISTS语句替换它:

select
  *
from
  table1 t1
where
  exists ( {subs} )

然后{subs}可以替换为不产生NULL的任何表达式。

这适用于Oracle:

select * from table1 where col1 in (col1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM