相关疑难解决方法(0)

SELECT * 在生产代码中的良好用例是什么?

出于习惯,我从不SELECT *在生产代码中使用(我只将它用于临时废料查询,通常是在学习对象的模式时)。但是我现在遇到了一个案例,我很想使用它,但如果我使用它会觉得很便宜。

我的用例是在一个存储过程中,其中创建了一个本地临时表,该表应始终与用于创建它的基础表相匹配,无论何时运行该存储过程。临时表是在很晚之后填充的,因此快速创建临时表而不冗长的方法SELECT * INTO #TempTable FROM RealTable WHERE 1 = 0尤其适用于具有数百列的表。

如果我的存储过程的使用者不知道动态结果集,那么我将服务出售给 有什么问题SELECT *吗?

sql-server best-practices sql-server-2016

39
推荐指数
5
解决办法
8353
查看次数

SQL Spec 是否需要在 EXISTS() 中使用 GROUP BY

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 BYEXISTS条款,是有效的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)

postgresql sql-server group-by sql-standard exists

11
推荐指数
1
解决办法
2438
查看次数

错误:运算符不存在:text[] ~~ text

我们有一个简单的语法,允许我们查看单个标量的数组,

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 array operator like string-searching

5
推荐指数
1
解决办法
1万
查看次数