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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

3 回答

?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊

在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]


查看完整回答
反對(duì) 回復(fù) 2019-10-11
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

通過(guò)@Tometzky充實(shí)了很棒的建議。


這應(yīng)該FIELD()在pg 8.4下為您提供一個(gè)類似于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)在無(wú)法在8.4上驗(yàn)證上述內(nèi)容;但是,我可以向后工作到在我前面的8.1實(shí)例上可用的“道德上”等效的版本:


-- 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)


查看完整回答
反對(duì) 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 1752 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)