在我的表格中,我有一个字段“firstname”和一个字段“lastname”。我想选择firstname + space + lastname为特定值的所有记录。
我试过这个:
$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)";
但这不起作用。有了Google,我发现了一些关于使用||的东西,但我真的不明白我应该如何使用该运算符。请注意,我不想使用or-operator(在许多语言中使用什么||),而是要连接2个字段(在它们之间有空格)并在其上使用LIKE。
谢谢!
答案 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
。
然而,并非所有数据库都以这种方式实现它,因此确切的语法取决于特定的数据库。
答案 2 :(得分:1)
SELECT *
FROM sam_users
WHERE TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?;