2012-11-04 28 views
4

我的表如下:ORDER BY取決於列類型

a | b 
----- 
1 | a 
2 | b 

在我的詢問,我想條款取決於列的類型來更改順序。

因此,像

get_data($order_by_column) { 

    .... 
    ORDER BY 
    CASE 
     WHEN is_numeric($order_by_column) THEN $order_by_column 
     ELSE CHAR_LENGTH($order_by_column) 
    END 
} 

我檢查了,似乎這是相當難以確定列的類型動態地像在上面的查詢。什麼是替代品(或替代品)來實現這一目標?

+0

另外通過類型列名 – zerkms

+1

@zerkms:確實沒有必要。 –

回答

10

您可能會感興趣pg_typeof()

ORDER BY 
    CASE pg_typeof($order_by_column) 
     WHEN 'integer'::regtype THEN $order_by_column 
-- WHEN 'text'::regtype THEN ... 
-- WHEN 'boolean'::regtype THEN ... 
     ELSE length($order_by_column) 
    END 

注意,一個CASE聲明的腿需要返回類型匹配,這恰好是這裏的情況,因爲$order_by_columnlength($order_by_column)都返回integer

更多關於object identifier types like regtype in the manual

找到所有註冊的類型:

SELECT * from pg_type 

再次,更多關於pg_type in the manual

+0

輝煌。謝謝。 – ericbae