postgresql SQL -如何对以空字符串作为条目的VARCHAR列中的数字进行排序

c2e8gylq  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(192)

我有一个postgres专栏,内容如下:

只有数字或空字符串。
我希望能够按数字对数字进行排序,但当我将列强制转换为浮点型时,它会给予我以下错误:

ERROR:  invalid input syntax for type double precision: ""

有没有一种方法可以进行这种排序,并将空字符串视为0?
这是我的查询失败:

SELECT C.content
FROM row R 
LEFT JOIN cell C ON C.row_id = R.row_id 
WHERE R.database_id = 'd1c39d3a-0205-4ee3-b0e3-89eda54c8ad2' 
AND C.column_id = '57833374-8b2f-43f3-bdf5-369efcfedeed'
ORDER BY cast(C.content as float)
jk9hmnmh

jk9hmnmh1#

当它是一个空字符串时,您需要将其视为null或0,然后它才能工作,请尝试按以下顺序放置case语句

ORDER BY 
    case when C.content = '' then 0
         else cast(C.content as float)
    end
0mkxixxg

0mkxixxg2#

如果确定该列永远不会有负值,一个简单的选择就是添加前导零。
如果列为NULL或包含空字符串,则按0排序。
否则,值将按原样排序,因为添加前导零不会更改任何内容。

SELECT yourcolumn 
FROM yourtable
ORDER BY CAST(CONCAT('0',yourcolumn) AS FLOAT);

如果可能出现负值,则会失败,因此我将使用CASE WHEN
但是我建议NULL值也取0,不仅仅是空字符串:

SELECT yourcolumn 
FROM yourtable
ORDER BY 
CASE WHEN yourcolumn = '' OR yourcolumn IS NULL 
  THEN 0
  ELSE CAST(yourcolumn AS FLOAT)
END;

否则,NULL值将被排序为最高数字,这可能不是预期的。
是的,我知道你写了只有数字和空字符串在你的表中,但也许这可以改变(除非列是不可空的),所以添加这个条件没有坏处。

相关问题