在Postgres sql语句中检查value是null还是空字符串的最佳方法是什么?
值可以是长表达式,因此最好只检查一次.
目前我正在使用:
coalesce( trim(stringexpression),'')=''
Run Code Online (Sandbox Code Playgroud)
但它看起来有点难看.
stringexpression可以是char(n)包含char(n)具有尾随空格的列的列或表达式.
最好的方法是什么?
我试图从表中获取25个15,000个ID的随机样本.而不是每次都手动按下运行,我正在尝试循环.我完全理解的不是Postgres的最佳用法,但它是我的工具.这是我到目前为止:
for i in 1..25 LOOP
insert into playtime.meta_random_sample
select i, ID
from tbl
order by random() limit 15000
end loop
Run Code Online (Sandbox Code Playgroud) PostgreSQL可以在任何地方开始使用数组下标.
考虑这个创建一个包含3个元素的数组的示例,其中包含5到7的下标:
SELECT ('[5:7]={1,2,3}'::int[]);
Run Code Online (Sandbox Code Playgroud)
返回:
[5:7]={1,2,3}
Run Code Online (Sandbox Code Playgroud)
例如,你得到第一个元素的含义
SELECT ('[5:7]={1,2,3}'::int[])[5];
Run Code Online (Sandbox Code Playgroud)
我想规范化 任何给定的1维数组以从数组下标1开始.
我能想到的最好的:
SELECT ('[5:7]={1,2,3}'::int[])[array_lower('[5:7]={1,2,3}'::int[], 1):array_upper('[5:7]={1,2,3}'::int[], 1)]
Run Code Online (Sandbox Code Playgroud)
或者,同样,更容易阅读:
WITH x(a) AS (
SELECT '[5:7]={1,2,3}'::int[]
)
SELECT a[array_lower(a, 1):array_upper(a, 1)]
FROM x
Run Code Online (Sandbox Code Playgroud)
你知道更简单/更快或更优雅的方式吗?
为了测试性能,我提出了这个快速基准测试.
表有100k行,随机长度在1和11之间的简单整数数组:
CREATE TEMP TABLE t (a int[]);
INSERT INTO t -- now with actually varying subscripts
SELECT ('[' || g%10 || ':' || 2*(g%10) || ']={1'
|| repeat(','||g::text, g%10) || '}')::int[]
FROM generate_series(1,100000) g;
EXPLAIN ANALYZE
SELECT
substring(a::text, '{.*$')::int[] -- Total runtime: 949.304 …Run Code Online (Sandbox Code Playgroud) postgresql ×3
arrays ×1
coalesce ×1
database ×1
for-loop ×1
null ×1
performance ×1
plpgsql ×1
random ×1
sql ×1