【问题标题】:Combining two fields in SELECT statement在 SELECT 语句中组合两个字段
【发布时间】:2011-07-14 14:01:38
【问题描述】:

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

我试过这个:

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

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

谢谢!

【问题讨论】:

  • 这是什么 RDBMS?为什么你使用LIKE 而不是=
  • MySQL,但我使用的是 PDO 库 (PHP),因此它应该是可移植的。我使用 LIKE 是因为我正在创建一个“搜索”字段,因此结果应该是所有用户的列表,其名称与输入的字符串类似。
  • @Bv202 - 不确定是否有“最便携”的字符串连接方法。如果有任何答案涵盖这一点,我自己会感兴趣。
  • 你想要 WHERE user_firstname LIKE(?) AND user_lastname LIKE(?)?
  • 不,我真的需要像 CONCAT 关键字这样的东西

标签: mysql sql


【解决方案1】:

使用 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 *;只选择您需要的列。

【讨论】:

  • 哦,太容易了...不知何故我一定错过了 CONCAT 关键字...感谢有关 SELECT *; 的链接这很有趣:)
  • 使用 count(*) 怎么样?这也是一件坏事吗?
  • @Bv202:一点也不。 COUNT(*) 是一个特例。不检查列本身的计数(尽管它们将用于任何其他子句),只检查匹配的行。即使没有这种优化,更改表定义也不会影响COUNT(*),从而导致问题。
  • 非常感谢您的解释:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
    SELECT * 
    FROM   sam_users 
    WHERE  TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?; 
    

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2013-05-31
      • 2017-07-14
      • 2015-08-30
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2010-11-24
      相关资源
      最近更新 更多