我在 Ubuntu 上使用 PostgreSQL 11.5
问题
我有带有连接表和where
条件的 sql,看起来像这样。
...
where
s_product.product_shop_id in (
'237002',
'230041',
'467173',
'464431',
'318417',
...
当我运行 sql.
copy(
select distinct on ("HOBIS")
-- s_product.product_id,
product_shop_id as "HOBIS",
product_name as "NAME",
concat('https://eshop.unihobby.cz/',product_url,'/',s_product.product_id,'p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019') as "URL",
concat('https://eshop.unihobby.cz/bin/product/4/',filename) as "IMG URL",
price_tax as "PRICE VAT",
case when price_rec > price_tax then concat(price_rec) end as "PRICE ORIGINAL"
from
s_product
left join s_product_image on s_product.product_id = s_product_image.product_id
left join s_pricelist_generated_lists on s_product.product_id = s_pricelist_generated_lists.product_id
where
s_product.product_shop_id in (
'237002',
'230041',
'467173',
'464431'
)
and image_order = '0'
and s_pricelist_generated_lists.group_id = '1'
--order by "HOBIS"
) to stdout (format csv, quote '"');
结果按 排序s_product.product_shop_id
。
...
230041,"Interiérové dveře Klasik plné dub archico, 3D povrch - 60 cm L",https://eshop.unihobby.cz/stavba-dvere-interierove-dvere-dvere-klasik-plne-dub-archico-3d-povrch/136280p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/klasik-plne-dub-archico.jpg,990.00,1390.00
237002,Vinylová podlaha Kronostep - True Grit,https://eshop.unihobby.cz/stavba-podlahy-vinylove-podlahy-podlaha-vinylova-kronostep-true-grit-5-0mm/151328p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/237002-krono-original-krono-xonic-r018-true-grit-3.jpg.big.jpg,1058.00,1323.00
318417,Primalex Malvena na fasády 1 l,https://eshop.unihobby.cz/bydleni-barvy-a-laky-venkovni-barvy-primalex-malvena-na-fasady-1l/153358p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/318417-malvena-5l.jpg,199.00,
464431,Benzínová řetězová pila CSH46 Scheppach,https://eshop.unihobby.cz/zahrada-zahradni-technika-retezove-pily-benzinove-retezove-pily-pila-retezova-benzinova-csh46-scheppach/150162p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/464431-csh46-scheppach-diy-garten-titel-neu-na.jpg,3290.00,
...
但我希望有结果,因为它们处于where
状态。有可能有结果where
吗?sort
当我的 sql中没有条件时,为什么要对结果进行 PG 排序?
谢谢。
如果您更改将值传递给 WHERE 子句的方式,则可以这样做。一种方法是加入一个未嵌套的数组并使用数组索引进行排序。
由于您需要不同的排序顺序,因此
distinct on ()
您必须将查询包装在派生表中。内部使用order by
“不同列”上的一个。然后可以按数组索引对结果进行排序。这与 IN 条件的行为有点不同,因此您必须确保每个商店 ID 在数组中只出现一次。
Postgres 不会对您的结果进行排序。
如果没有
order by
子句,数据库可以自由地以它想要的任何顺序返回行。“顺序”来自执行计划中的不同步骤。如果您看到一些感知到的“顺序”,那么这可能源于通过索引检索行。但是你看到的“顺序”并不能保证。它可能会因为行已被更改或插入到表中,或者因为查询优化器选择使用不同的执行计划而发生变化。或者因为其他一些事务正在运行类似的语句。