Query

使用 OR 或 IN 子句查詢有序列表

  • October 31, 2018

我正在items從數據庫中查詢並將其顯示給使用者。(在我的範例中,我將contacts在 table 中使用tContacts

使用者按照他決定的順序選擇幾個items(使用者可以隨機選擇項目,因此不能指定要排序的列)。

在應用程序中,我itemsordered list.

目前我查詢這些對象的更多詳細資訊one-by-one

是否可以使用“有序列表”創建查詢,它items相同的順序返回?

類似的東西(是的,這很醜 - 可能也達到了最大 sql 查詢大小):

SELECT * FROM (
   --how to append this list...
   SELECT 0 as listIndex, * from tContacts where conIdContact = 13259;
   SELECT 1 as listIndex, * from tContacts where conIdContact = 12472;
   [...]
   SELECT 568 as listIndex, * from tContacts where conIdContact = 12422;
)
ORDER BY listIndex
  • 或者:我是否必須繼續查詢one-by-one
  • 或:這是否需要一個臨時表(插入 id 和優先級),然後查詢,然後再次刪除臨時表。
  • 或:查詢 a**batch**並重新排序應用程式碼中的項目(由於列表可能很大,這可能會很慢)

注意:首選獨立於數據庫的解決方案(mariadb / mysql、postgresql 和 h2 被認為用於生產。

我的臨時表概念:

CREATE TEMPORARY TABLE temp_OrderedContacts(
   listIndex INT NOT NULL DEFAULT 0,
   contactId INT NOT NULL DEFAULT 0
);

INSERT INTO temp_OrderedContacts (listIndex, contactId)
VALUES (0,13259), (1,12472), (2,12422);

SELECT * FROM tContacts
JOIN temp_OrderedContacts ON (tContacts.conIdContact = temp_OrderedContacts.contactId)

DROP TABLE temp_OrderedContacts;

Postgres 解決方案是將所有 ID 放入一個數組中,然後使用如下內容:

select t.*, il.listindex
from contacts t
  join unnest(array[13259, 12472, ..., 12422]) with ordinality as il(id, listindex) 
    on t.conidcontact = il.id
order by il.listindex;

(上面實際上是標準的 ANSI SQL - 但據我所知只有 Postgres 和 HSQLDB 支持)

該數組也可以作為準備好的語句中的參數傳遞(或您使用的程式語言中的任何術語)。


如果您可以建構動態查詢,另一種選擇是使用行值建構子:

select t.*, il.listindex
from contacts t
  join ( 
     values 
       (1, 13259), 
       (2, 12472),  
       ..... 
       (568, 12422)
 ) as il(listindex, id) on t.conidcontact = il.id
order by il.listindex;

(以上為100%標準ANSI SQL)

引用自:https://dba.stackexchange.com/questions/205664