SQL 星号(*) 所有可能的用途

ani*_*777 8 sql

我有一个简单的问题。我想列出我们可以使用关键字星号(或星号)* 的所有场景。

我只知道这些场景:

Select * from Customers;
Select Count(*) from Customers;
Select Customers.quantity * Customers.price from Customers;
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索了所有内容,但没有找到任何其他用例。

此外,我们可以在选择查询中将 * 与列一起使用的场景。

编辑:好的,因为@Lucas Eder 要求知道我的用例,这里是。我有一个接受 SQL 查询并将其存储在数据库中的程序。在存储之前,它会验证不允许创建select *Count(*)查询。除此之外,它应该允许所有其他查询。所以这就是我想知道其他使用场景的原因,*以便我可以将它们列入白名单。

Luk*_*der 14

有趣的问题!

以下是jOOQ对各种 SQL 方言的了解(查看其来源):

重复你的(有一些评论):

-- Unqualified asterisk
SELECT * FROM t;

-- Unqualified asterisk with useful Google BigQuery extension
SELECT * EXCEPT (a, b) FROM t

-- Asterisk in COUNT
SELECT COUNT(*) FROM t;

-- Multiplication operator for numbers
SELECT a * b FROM t;

-- Multiplication operator for intervals / numbers
SELECT INTERVAL 1 DAY * 3 FROM t;
Run Code Online (Sandbox Code Playgroud)

其他情况 jOOQ 知道:

-- Qualified asterisk
SELECT t.* FROM t;

-- Multiline comment syntax
SELECT /* important column */ a FROM t;

-- Oracle hint syntax
SELECT /*+FIRST_ROWS*/ a FROM t;

-- Old SQL Server outer join syntax (no longer supported)
SELECT * FROM t, u WHERE t *= u;

-- Oracle precision / scale wildcard
CREATE TABLE t (a NUMBER(*), b NUMBER(*, 2));

-- PostgreSQL syntax for case insensitive pattern matching (ILIKE) 
-- (there are many more operators)
SELECT 'abc' ~~* 'A%'
Run Code Online (Sandbox Code Playgroud)

我知道的其他情况:

-- MATCH_RECOGNIZE pattern matching
SELECT * FROM t MATCH_RECOGNIZE ( ... PATTERN X Y* Z ... )

-- Oracle 21c's projecting everything into JSON
SELECT JSON_OBJECT(*) FROM t
Run Code Online (Sandbox Code Playgroud)

字符串文字内容,也被指定和解析:

-- Regular expressions (the asterisk is in a string literal, but it's still worth noting)
SELECT regexp_replace(a, 'a*', '') FROM t;

-- Similar predicate (again, it's in a string literal but the format is specified)
SELECT 'abc' SIMILAR TO 'a*'

-- JSON Path contents (there are quite a few possible asterisks here)
SELECT JSON_QUERY(col, '$.*') FROM t;

-- XPath contents
SELECT XMLQUERY('/x/*' PASSING t.xmldoc) FROM t
Run Code Online (Sandbox Code Playgroud)

深奥的案例

ISO/IEC 9075-2:2016(E) SQL 标准在 21.6 <embedded SQL Fortran program> [原文如此!]

<Fortran 类型规范> ::= CHARACTER [ <星号> <字符长度> ] [ CHARACTER SET [ IS ] <字符集规范> ]

是的。你自找的!

  • @aniket_777:好的,这可能会带来一个新问题。但请不要仅仅因为这样的验证而混淆所有乘法。您可以使用正则表达式实现启发式,该正则表达式不允许使用“SELECT *”和“COUNT(*)”表达式(在区分大小写和空格等方面有一定的宽容)或使用解析器,但我什至怀疑这是合理的*一般来说* (2认同)