使用 SELECT 可以做的酷事

我在工作中经常使用 SQL。有些查询相当庞大(多达数百行),而且运行时间很长。如果查询有问题,就很难对其进行分解和调试。

有一种方法一直很有用,那就是使用 SELECT 本身。

操作

例如,如果我想了解为什么我的 [0-9]+-[0-9]+ SIMILAR TO 正则表达式没有捕捉到字符串 "10-20",我可以使用 SELECT 进行尝试,而无需运行整个查询:

SELECT '10–20' SIMILAR TO '[0-9]+-[0-9]+'; -- FALSE

它可以让我立即发现分隔符是 em 破折号而不是 en 破折号-,并调整正则表达式以包含其中任何一个:

SELECT '10–20' SIMILAR TO '[0-9]+[-–][0-9]+'; -- TRUE

连接测试

不确定是否仍连接到远程数据库?SELECT 1 可以告诉你,它比 SELECT * FROM users输入更快,运行也更快。

函数

SELECT 还会返回函数的结果。例如当前时间戳 current_timestamp、数据库版本version()或特定日期的星期:

SELECT current_timestamp;

SELECT version();

SELECT EXTRACT(DOW FROM TIMESTAMP '1999-01-01'); -- 5, Friday

注:我不明白为什么 current_timestamp 不需要括号,而 version() 却需要,因此不想深入研究。如果你想,请告诉我!

静态数据

最后,SELECT 可以为你创建数据。诚然,这不是我经常遇到的用例。但我可以想象,在某些情况下,你需要将两个查询联合起来UNION ALL,而且列必须匹配。在这种情况下,你可以创建一些假列:

SELECT NULL AS user_id, 'guest' as username;
user_id username
NULL guest

或者,您可能需要几行数据进行 JOIN:

SELECT 1 AS user_id
UNION ALL
SELECT 2 AS user_id;
user_id
1
2

FROM 的深入探讨超出了本篇文章的范围,但我也要提一下,如果你确实需要大量这样的数据,你可以用 FROM 创建虚假行:

SELECT
  *
FROM (
  VALUES
  (1, 'chicken'),
  (2, 'bacon'),
  (3, 'ranch')
) AS users (id, username)
id username
1 chicken
2 bacon
3 ranch

总之,不要忘记 SELECT。它不仅仅是一个指定要从表中获取哪些记录的工具。

阅读余下内容
 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号