添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

大多数字符串比较默认为所谓的

ASCIIbetical sorting.它将每个字符转换为其ASCII编号(或者可能是UTF-8,其与前7位的ASCII重叠)然后进行排序.这看起来很好……

select 'a' < 'z'; -- true

……但很快就会出错.

select 'a' < 'Z'; -- false

这是因为所有大写字母都在ASCII和UTF-8中的所有小写字母之后.

解决这个问题的简单方法是通过在两侧调用upper或lower来规范化大小写.

select lower('a') < lower('Z'); -- true

ASCIIbetical排序的第二个问题是数字.再次,它开始很好……

select 'a9' < 'a1'; -- true

……但很快就去了锅.

select 'a9' < 'a10'; -- false

ASCIIbetical排序一次比较一个字符. ASCII 9(57)小于ASCII 1(49).

你想要的是一个natural sort,其中字符串部分作为字符串进行比较,数字作为数字进行比较.在SQL中进行自然排序并不是最简单的事情.您需要固定的字段宽度来分别对每个子字符串进行排序,或者可能需要使用正则表达式…

幸运的是,pg_natural_sort_order是Postgres扩展,实现了高效的自然排序.

如果您无法安装扩展,则可以使用存储过程,例如2kan的btrsort.

CREATE FUNCTION btrsort_nextunit(text) RETURNS text AS $$

SELECT

CASE WHEN $1 ~ '^[^0-9]+' THEN

COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM '[^0-9]+'))+1 ), '' )

COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM '[0-9]+'))+1 ), '' )

$$LANGUAGE SQL;

CREATE FUNCTION btrsort(text) RETURNS text AS $$

SELECT

CASE WHEN char_length($1)>0 THEN

CASE WHEN $1 ~ '^[^0-9]+' THEN

RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM '^[^0-9]+'), ''), 1, 12), 12, ' ') || btrsort(btrsort_nextunit($1))

LPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM '^[0-9]+'), ''), 1, 12), 12, ' ') || btrsort(btrsort_nextunit($1))

$$LANGUAGE SQL;

虽然它没有提供比较运算符,但我不会假装理解它.这允许您按顺序使用它.

select * from things order by btrsort(whatever);

create index things_whatever_btrsort_idx ON things( btrsort(whatever) );

大多数字符串比较默认为所谓的ASCIIbetical sorting.它将每个字符转换为其ASCII编号(或者可能是UTF-8,其与前7位的ASCII重叠)然后进行排序.这看起来很好……select 'a' &lt; 'z'; -- true……但很快就会出错.select 'a' &lt; 'Z'; -- false这是因为所有大写字母都在ASCII和UTF-8中的所有小写字母之后.解决这个问题... 1、当程序执⾏到input,等待用户输⼊,输⼊完成之后才继续向下执⾏。 2、input接收⽤用户输⼊入后,⼀一般存储到变量量,⽅方便便使⽤用。 3、input会把接收到的任意⽤用户输⼊入的数据都当做 字符串 串处理理。 username = input('请输入你的用户名') print(f'你的用户名是{username}') print(type(username)) # -*- en
功能说明:对以 数字 结尾的 字符串 进行分割之后,第一部分按照 postgresql 默认的排序方式排序,第二部分按照 数字 的大小进行排序。 目标排序结果,以 数字 结尾 字符串 前半部分(addd-)一样情况下按照后半部分 数字 (1、2、3、10)大小排序。 相关自定义函数:
使用 zabbix进行无端远程 Postgresql 监视 Zabbix的 Postgresql 模板(无代理) 将脚本“ db- pg stat.pl”放置在zabbix-server externalscripts文件夹( ) 中 ,确保其具有执行权限(Ubuntu -/ usr / share / zabbix / externalscripts)。 导入模板“ Template_App_ PostgreSQL .xml”。 在模板的宏部分{ PG _USER_NAME},{ PG _PASSWORD},{ PG _DATABASE} 中 输入AWS凭证 将上面的模板附加到相关主机。 在主机级别上设置以下宏-{ PG _HOST_NAME},如果主机名与实际计算机不同(例如RDS) 1.1. 存储固定长度(n)的 字符串 。n 范围是 [0, 255]。n 的缺省值为 1. 1.2. 当插入的 字符串 长度小于 n 时,My SQL 会在末尾补充空格。查询的时候,My SQL 会删除末尾的空格(不会删除头部空格)。 1.3. My SQL 在处理 >、 >=、 <、...
[]==![]为啥是truehttps://www.zhihu.com/video/1093653733820436480一、 引子先上题,得出心 中 答案,打开浏览器点开 F12,复制下面代码,看看结果。console.log( [] == ![] ) console.log( {} == !{} )剖析一下,主要分为:! 逻辑 运算符 的优先级,{} 与 [] 复杂数据类型如何转换;== JS 的数据...
昨天写入 PG 的时候直接用insert命令拼接 字符串 被数据库的同事批了,o(╥﹏╥)o 这里我测试了3种写入 PG 数据库的方式,数据源为1个含有13642条数据的csv,并进行了一个对比: 1.insert命令写入 具体的命令代码见我的这篇文章:https://blog.csdn.net/weixin_44731100/article/details/88534304 可见,写入13642...
-- 常用 字符串 函数 select 100 || 'A' || null || 'B' -- 只要含有一个null,那么结果全都是null select concat(100, 'A', null, 'B') -- 会省略null,输出 select char_length(100) -- 报错,不支持对整形求长度 select length(100) -- 报错,不支持对整形求长度 select length(100::text) --将100转为文本后求长度(方式一),返回3 select l...
substring(string from start [for length]) 其 中 ,string是要截取的 字符串 ,start是起始位置,length是要截取的长度。如果不指定length,则会截取从start位置开始到 字符串 末尾的所有字符。 例如,要截取 字符串 "hello world" 中 的"world",可以 使用 以下语句: SELECT substring('hello world' from 7); 结果为:"world" 如果要截取 字符串 中 的一段子串,可以指定起始位置和长度,例如: SELECT substring('hello world' from 3 for 5); 结果为:"llo w"