巧妙的方法使用SQL连接字符串

结构化查询语言(SQL)是一种非常强大的工具,并且其中包含很多功能。掌握了最重要的SQL命令后,您就可以开始从SQL中获得更多创意。今天,我将向您展示有关SQL连接字符串的所有信息。

有许多不同的SQL方言。对于所有这些示例,我使用的是PostgreSQL变体。

什么是串联?

串联意味着将两件事结合在一起。您可能已经在编程语言中使用过它来将两个字符串连接在一起。也许您有一个名字和姓氏变量,它们作为一个全名变量结合在一起。

串联是将两个字符串组合为一个非常有用的方法。 PHP 使用句点将字符串连接在一起,而 JavaScript 和jQuery使用加号。

SQL中的串联完全相同。您可以使用特殊运算符将两件事结合在一起。这是伪代码中的示例:

first_name = Joelast_name = Coburnwhole_name = first_name + last_name

在编程语言中,串联使代码更易于阅读。如果您的代码始终需要访问两个字符串,则将它们组合成一个字符串可以更容易记住,并减少了代码的长度。

虽然SQL中的变量不那么普遍(但仍在使用),但是串联仍然需要返回组合结果或操作数据。

如何进行连接

在SQL中,连接非常简单。尽管SQL是一种通用语言,但是各个数据库引擎以不同的方式实现功能。尽管所有这些示例都在PostgreSQL方言中,但只需在Web上搜索“ Concatenate ",就可以轻松将其转换为其他变体。不同的引擎可能具有不同的串联语法,但是原理保持不变。

回到我们的名称示例,这是一个基本的 select 查询:

SELECT first_name, last_name, email FROM users_table

这里没有什么复杂的东西,因此我们在连接中添加:

SELECT first_name || last_name AS full_name, email FROM users_table

如您所见,这种连接效果很好,但是存在一个小问题。产生的全名已完全按照两列的乘积缝合在一起-名称之间应该有一个空格!

幸运的是,很容易解决:只需在两者之间加上一个空格即可:

SELECT first_name || ' ' || last_name AS full_name, email FROM users_table

这些是基本示例,但是您应该了解串联的工作原理—确实如此简单!子句之间两次使用了管道运算符( | )。您的SQL引擎知道该符号之前和之后的每个部分都应连接在一起并视为一个部分。不过请注意,如果使用concat运算符但不进行任何连接,则会出现错误。

如上所述,这些示例使用了SQL的PostgreSQL变体。其他变体可能使用其他运算符,甚至可能需要调用特殊功能。 如何并没有关系,只要您按照数据库引擎期望的方式进行操作即可。

更深入

现在,您可以了解了基础知识之后,我们来看一些更深入的示例以及一些常见的陷阱。

大多数数据库引擎都可以成功地将字符串和整数混合在一起,甚至日期也可以混合在一起。尝试连接复杂类型(例如数组)时,通常会遇到问题:

SELECT first_name || ' ' || last_name || ARRAY[123, 456] AS full_name, email FROM users_table

此代码将不起作用。。无法将字符串与复杂对象(例如数组)组合在一起。如果您考虑需要做什么,通常可以编写有效的简单代码,而不是无法运行的复杂疯狂的代码。

如果您已经仔细考虑了需要做什么,并且仍然无法使SQL正常工作,那么您是否考虑过使用编程语言?作为从事遗留代码的软件开发人员,我知道尝试调试SQL的痛苦,因为有人将如此多的逻辑塞入其中,这简直是一个奇迹-如果您要尝试使用SQL编写逻辑,然后切换到编程语言(有很多简单的语言可供学习)。

连接对于 where 语句也非常有效:

SELECT first_name, last_name, email FROM users_table WHERE date_of_birth = ('DAY' || '/' || 'MONTH' || '/' || 'YEAR')::date

这里发生了一些事情。在此示例中, DAY MONTH YEAR 是从脚本传递来的参数。这些可能是通过代码生成的,或者是由用户输入的。将它们串联在一起,然后强制转换为日期类型(使用PostgreSQL强制转换为日期语法 :: date )。

以这种方式使用串联可以将各个个体链接在一起日期的一部分,然后可以将其作为“实际"日期而不是字符串来处理。不要忘了这个基本示例不能防止SQL注入,因此不要在未经修改的情况下在任何生产代码中使用它。

需要注意的另一个陷阱是 null 值(空字符串是空字符串或不存在的字符串)。给出以下查询:

SELECT first_name || ' ' || NULL AS full_name, email FROM users_table

此查询无提示失败。这是由于在数据库引擎上内部编码了串联方式。您可能不会总是遇到此问题,但这是很常见的情况。

如果您认为查询返回的数据可能为空,则需要使用 coalesce 。可以将Coalesce粗略地认为是“如果为null,则用其他字符串或列替换":

无论您做什么工作,请在下面的评论中告诉我们!

标签: 编程 SQL