出于习惯,我从不SELECT *在生产代码中使用(我只将它用于临时废料查询,通常是在学习对象的模式时)。但是我现在遇到了一个案例,我很想使用它,但如果我使用它会觉得很便宜。
我的用例是在一个存储过程中,其中创建了一个本地临时表,该表应始终与用于创建它的基础表相匹配,无论何时运行该存储过程。临时表是在很晚之后填充的,因此快速创建临时表而不冗长的方法SELECT * INTO #TempTable FROM RealTable WHERE 1 = 0尤其适用于具有数百列的表。
如果我的存储过程的使用者不知道动态结果集,那么我将服务出售给 有什么问题SELECT *吗?
Microsoft 当前允许使用此语法。
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT *
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) > 1
);
Run Code Online (Sandbox Code Playgroud)
请注意,没有GROUP BY中EXISTS条款,是有效的ANSI SQL。或者它只是暴露了一个实现细节。
作为参考,PostgreSQL 中不允许使用相同的语法。
错误:列“tx”必须出现在 GROUP BY 子句中或用于聚合函数中
但是这种语法是允许的..
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT 1 -- This changed from the first query
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) …Run Code Online (Sandbox Code Playgroud) 我们有一个简单的语法,允许我们查看单个标量的数组,
SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);
Run Code Online (Sandbox Code Playgroud)
我们可以用同样的方法来匹配 LIKE
SELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果你想做另一个。
SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%'
ERROR: syntax error at or near "ANY"
LINE 1: SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%';
Run Code Online (Sandbox Code Playgroud)
我知道语法不起作用,但我希望它起作用。
# SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
ERROR: operator does not exist: text[] ~~ unknown
LINE 1: SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
我想过滤一个数组以查看元素是否存在。这可能不使用 …
postgresql ×2
sql-server ×2
array ×1
exists ×1
group-by ×1
like ×1
operator ×1
sql-standard ×1