我有这个 :
CREATE TABLE users
(
first_name varchar(60) NOT NULL,
last_name varchar(60) NOT NULL
);
INSERT INTO users
(first_name, last_name)
VALUES
('Sylvia ', 'Hoeks'),
('Harrison', 'Ford');
我得到这样的清单
SELECT first_name || ' ' || last_name AS user_full_name FROM users;
但我希望能够在该列上进行搜索user_full_name
。没有子查询或 CTE 是否可能(如下所示)?
WITH users_list AS (
SELECT first_name || ' ' || last_name AS user_full_name
FROM users
)
SELECT * FROM users_list WHERE user_full_name ILIKE '%lvi%';
我试过第一列!?
SELECT first_name || ' ' || last_name AS user_full_name FROM users WHERE 1 ILIKE '%lvi%';
/*
ERROR: operator does not exist: integer ~~* unknown
LINE 1: ...|| last_name AS user_full_name FROM users WHERE 1 ILIKE '%lv...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
*/
我希望能够做这样的事情。
SELECT first_name || ' ' || last_name AS user_full_name FROM users WHERE user_full_name ILIKE '%lvi%';
目前我这样做:
SELECT first_name || ' ' || last_name AS user_full_name FROM users WHERE first_name ILIKE '%lvi%' OR last_name ILIKE '%lvi%';
如果需要,小提琴:https ://www.db-fiddle.com/f/c3HANw8M9W7kSWeEwidpne/0
执行此操作的常用方法是使用派生表:
这是非常基本和通用的 SQL,任何混淆层(又名“ORM”)都应该能够处理它。
您还有其他选择:
1.使用视图
使用计算函数创建一个视图,并告诉您的混淆层使用该视图。
2.创建“虚拟”栏目
Postgres 并没有真正的计算列(例如 Oracle 或 SQL Server),但您可以使用函数模拟它们:
这可以像这样使用:
请注意,列名的前缀是必需的,否则它不起作用。我不知道你是否可以教你的混淆层来创建这样的 SQL。
3. 使用触发器填充附加列
然后你可以简单地写:
这可能是最容易集成到混淆层中的解决方案。