gpt4 book ai didi

sql - UNION 查询按其组件单独排序

转载 作者:行者123 更新时间:2023-11-29 13:12:10 25 4
gpt4 key购买 nike

我使用的是 Postgres 9.6,我有一个查询显示包含特定字符串(在本例中为“xyz”)的前 100 行。大致如下所示:

SELECT name FROM data WHERE name ILIKE '%xyz%' ORDER BY other_column LIMIT 100;

我真正想要实现的是将在名称列开头匹配的行放在前面。所以总共仍然有 100 行,但首先填充匹配 name ILIKE 'xyz% 的结果,然后填充来自 ILIKE '%xyz%' 的结果。

我尝试通过大致如下所示的 UNION 查询来实现这一点

SELECT name FROM data WHERE name ILIKE 'xyz%' 
UNION
SELECT name FROM data WHERE name ILIKE '%xyz%'
ORDER BY other_column
LIMIT 100;

这显然是行不通的,因为它是按other_column 排序的。我最初的想法是为每个查询添加一列用于排序

SELECT 1 as sort_order, name FROM data WHERE name ILIKE 'xyz%' 
UNION
SELECT 2 as sort_order, name FROM data WHERE name ILIKE '%xyz%'
ORDER BY sort_order, other_column
LIMIT 100;

但这会终止 UNION 的重复删除,而是表现得像 UNION ALL,因为我通过添加 sort_order 列使原本相同的行不同。

我当然可以在数据库外的后续步骤中删除重复项,但这对我来说并不是一个非常有吸引力的解决方案。有什么方法可以分别对 UNION 查询的各个部分进行排序,并实现我描述的结果吗?

最佳答案

使用函数position(substring in string)代替 UNION,例如:

WITH data(name, other_column) AS (
VALUES
('abc xyz', 1),
('xyz abc', 2),
('a xyz b', 3),
('xyz abc', 4)
)

SELECT name, other_column
FROM data
WHERE name ILIKE '%xyz%'
ORDER BY position('xyz' in name), other_column
LIMIT 100;

name | other_column
---------+--------------
xyz abc | 2
xyz abc | 4
a xyz b | 3
abc xyz | 1
(4 rows)

或:

SELECT name, other_column
FROM data
WHERE name ILIKE '%xyz%'
ORDER BY position('xyz' in name) > 1, other_column
LIMIT 100;

name | other_column
---------+--------------
xyz abc | 2
xyz abc | 4
abc xyz | 1
a xyz b | 3
(4 rows)

关于sql - UNION 查询按其组件单独排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53417540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com