在SELECT语句中组合两个字段

Bv2*_*202 10 mysql sql

在我的表中,我有一个字段"firstname"和一个字段"lastname".我想选择firstname + space + lastname为某个值的所有记录.

我试过这个:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)";
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

out*_*tis 22

使用MySQL,您可以使用CONCAT:

SELECT * FROM sam_users 
  WHERE CONCAT(user_firstname, ' ', user_lastname) LIKE ?
Run Code Online (Sandbox Code Playgroud)

CONCAT_WS(忽略NULL值):

SELECT * FROM sam_users 
  WHERE CONCAT_WS(' ', user_firstname, user_lastname) LIKE ?
Run Code Online (Sandbox Code Playgroud)

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

您还可以将MySQL服务器SQL模式设置"ANSI""PIPES_AS_CONCAT"以使用||运算符进行字符串连接.

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

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

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', '');
Run Code Online (Sandbox Code Playgroud)

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

不要用SELECT *; 只选择您需要的列.