Mysql 在SELECT语句中组合两个字段

Mysql 在SELECT语句中组合两个字段,mysql,sql,Mysql,Sql,在我的表中有一个字段“firstname”和一个字段“lastname”。我想选择firstname+space+lastname为特定值的所有记录 我试过这个: $sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)"; 但这不起作用。通过谷歌,我发现了一些关于使用| |的东西,但我真的不明白我应该如何使用这个操作符。请注意,我不想使用or运算符(在许多语言中,| |是什么),而是

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

我试过这个:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)";
但这不起作用。通过谷歌,我发现了一些关于使用| |的东西,但我真的不明白我应该如何使用这个操作符。请注意,我不想使用or运算符(在许多语言中,| |是什么),而是连接两个字段(它们之间有一个空格)并使用类似的运算符

谢谢

使用MySQL,您可以使用:

SELECT * 
FROM   sam_users 
WHERE  TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?; 
或(忽略空值):

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

您还可以将设置为或使用
|
运算符进行字符串连接

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT');
SELECT * FROM sam_users 
  WHERE (user_firstname || ' ' || user_lastname) LIKE ?
这将仅为当前设置SQL模式。每次连接时都需要设置
@@sql\u模式
。如果您希望在会话中取消设置“管道作为连接”模式:

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', '');
MySQL似乎在
@@sql\u模式下删除了任何额外的逗号,所以您不必担心它们


不要使用;仅选择所需的列。

在SQL中,
|
运算符根据标准表示字符串连接(请参见SQL 2008:5.2)。布尔or运算符在SQL中写入

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

  • MySQL服务器使用该功能
  • MSSQL服务器使用运算符

这是什么RDBMS?为什么要像
那样使用
,而不是
=
?MySQL,但我使用的是PDO库(PHP),所以它应该是可移植的。我之所以使用LIKE,是因为我正在创建一个“搜索”字段,所以结果应该是所有用户的列表,这些用户的姓名与输入的字符串相似。@Bv202-不确定是否有“最可移植”的字符串连接方法。如果有答案的话我会很感兴趣的。你想知道用户名像(?)和姓像(?)在哪里吗?不,我真的需要像CONCAT关键字这样的东西哦,太简单了。。。不知怎的,我一定错过了CONCAT关键字。。。感谢您提供有关SELECT*的链接;这很有趣:)使用count(*)怎么样?这也是一件坏事吗?@Bv202:一点也不<代码>计数(*)
是一种特殊情况。列本身不检查计数(尽管它们将检查任何其他子句),只检查匹配的行。即使没有此优化,更改表定义也不会影响计数(*)
,不会导致问题。非常感谢您的解释:)
SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT');
SELECT * FROM sam_users 
  WHERE (user_firstname || ' ' || user_lastname) LIKE ?
SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', '');