我的表格如下:
a | b
-----
1 | a
2 | b
在我的查询中,我想根据列的类型更改order by子句。
类似
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 :(得分: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_column
和length($order_by_column)
都返回integer
。< / p>
有关object identifier types like regtype
in the manual的更多信息。
查找所有已注册的类型:
SELECT * from pg_type
再次,更多关于pg_type
in the manual。