第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Postgresql中模擬MySQL的ORDER BY FIELD()

在Postgresql中模擬MySQL的ORDER BY FIELD()

躍然一笑 2019-10-11 10:48:48
剛從MySQL首次嘗試PostgreSQL。在我們的Rails應用程序中,我們有幾個使用SQL的位置,如下所示:SELECT * FROM `currency_codes` ORDER BY FIELD(code, 'GBP', 'EUR', 'BBD', 'AUD', 'CAD', 'USD') DESC, name ASC很快就發(fā)現(xiàn)PostgreSQL不支持/不允許這樣做。有誰知道如何在PostgreSQL中模擬這種行為,還是我們必須將排序整理到代碼中?
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

在mysql中排序:


> ids = [11,31,29]

=> [11, 31, 29]

> User.where(id: ids).order("field(id, #{ids.join(',')})")

在postgres中:


def self.order_by_ids(ids)

  order_by = ["CASE"]

  ids.each_with_index do |id, index|

    order_by << "WHEN id='#{id}' THEN #{index}"

  end

  order_by << "END"

  order(order_by.join(" "))

end


User.where(id: [3,2,1]).order_by_ids([3,2,1]).map(&:id) 

#=> [3,2,1]


查看完整回答
反對 回復 2019-10-11
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

通過@Tometzky充實了很棒的建議。


這應該FIELD()在pg 8.4下為您提供一個類似于MySQL的函數(shù):


-- SELECT FIELD(varnames, 'foo', 'bar', 'baz')

CREATE FUNCTION field(anyelement, VARIADIC anyarray) RETURNS numeric AS $$

  SELECT

    COALESCE(

     ( SELECT i FROM generate_subscripts($2, 1) gs(i)

       WHERE $2[i] = $1 ),

     0);

$$ LANGUAGE SQL STABLE

Mea culpa,但我現(xiàn)在無法在8.4上驗證上述內容;但是,我可以向后工作到在我前面的8.1實例上可用的“道德上”等效的版本:


-- SELECT FIELD(varname, ARRAY['foo', 'bar', 'baz'])

CREATE OR REPLACE FUNCTION field(anyelement, anyarray) RETURNS numeric AS $$

  SELECT

    COALESCE((SELECT i

              FROM generate_series(1, array_upper($2, 1)) gs(i)

              WHERE $2[i] = $1),

             0);

$$ LANGUAGE SQL STABLE

更尷尬的是,您仍然可以方便地使用(可能派生的)貨幣代碼排名表,如下所示:


pg=> select cc.* from currency_codes cc

     left join

       (select 'GBP' as code, 0 as rank union all

        select 'EUR', 1 union all

        select 'BBD', 2 union all

        select 'AUD', 3 union all

        select 'CAD', 4 union all

        select 'USD', 5) cc_weights

     on cc.code = cc_weights.code

     order by rank desc, name asc;

 code |           name

------+---------------------------

 USD  | USA bits

 CAD  | Canadian maple tokens

 AUD  | Australian diwallarangoos

 BBD  | Barbadian tridents

 EUR  | Euro chits

 GBP  | British haypennies

(6 rows)


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 1728 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號