在SELECT语句中组合两个字段

时间:2011-03-13 19:14:36

标签: mysql sql

在我的表格中,我有一个字段“firstname”和一个字段“lastname”。我想选择firstname + space + lastname为特定值的所有记录。

我试过这个:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)";

但这不起作用。有了Google,我发现了一些关于使用||的东西,但我真的不明白我应该如何使用该运算符。请注意,我不想使用or-operator(在许多语言中使用什么||),而是要连接2个字段(在它们之间有空格)并在其上使用LIKE。

谢谢!

3 个答案:

答案 0 :(得分:22)

使用MySQL,您可以使用CONCAT

SELECT * FROM sam_users 
  WHERE CONCAT(user_firstname, ' ', user_lastname) LIKE ?

CONCAT_WS(忽略NULL值):

SELECT * FROM sam_users 
  WHERE CONCAT_WS(' ', user_firstname, user_lastname) LIKE ?

但是,MySQL在执行此查询时将无法使用任何indices。如果LIKE的模式参数的值以通配符开头,则MySQL将无法使用索引,因此与生成的值(而不是列)进行比较将不会产生影响。

您还可以将MySQL server SQL mode设置为"ANSI""PIPES_AS_CONCAT"以使用||运算符进行字符串连接。

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT');
SELECT * FROM sam_users 
  WHERE (user_firstname || ' ' || user_lastname) LIKE ?

这仅为当前session设置SQL模式。每次连接时都需要设置@@sql_mode。如果您希望在会话中取消设置“PIPES_AS_CONCAT”模式:

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', '');

MySQL似乎删除了@@sql_mode中的任何额外逗号,因此您无需担心它们。

不要使用SELECT *;只选择你需要的列。

答案 1 :(得分:2)

在SQL中,||运算符 表示根据标准进行字符串连接(请参阅SQL 2008:5.2)。布尔或运算符在SQL中写为OR

然而,并非所有数据库都以这种方式实现它,因此确切的语法取决于特定的数据库。

  • MySQL Server使用CONCAT函数。
  • MSSQL Server使用+运算符。

答案 2 :(得分:1)

SELECT * 
FROM   sam_users 
WHERE  TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?;