为何含$1占位符的PostgreSQL查询SELECT NOW() - INTERVAL '$1 DAY'可正常执行?
嘿,这个问题问得挺到位的!我来给你掰扯清楚为啥这个看似有问题的查询能正常跑起来。
首先你得明白一个关键:在PostgreSQL里,单引号包裹的内容是纯字符串字面量,里面的$1根本不是什么参数占位符——参数占位符只能出现在单引号外面的SQL语法节点里。所以你的查询里,'$1 DAY'就是一个普通的字符串,PostgreSQL要做的就是把这个字符串解析成INTERVAL类型。
那为啥这个解析能成?因为PostgreSQL的INTERVAL解析器自带容错buff,它会自动跳过那些它识别不了的前缀字符,直到找到有效的数字和时间单位。比如看到'$1 DAY'时,它直接忽略掉$符号,把后面的1 DAY当成有效的间隔表达式,自然就能成功转换了。
你可以自己跑个小测试验证一下:
SELECT INTERVAL '$1 DAY';
结果会返回1 day,这就实锤了解析器的容错逻辑。
反过来,如果把单引号去掉,写成INTERVAL $1,那这里的$1才是正经的参数占位符,这时候要是没传入对应的参数值,查询肯定会报错。
简单总结下:
- 单引号里的
$就是个普通字符,跟参数占位符没关系 - PostgreSQL的
INTERVAL解析器能智能跳过无效前缀,提取有效间隔部分
内容的提问来源于stack exchange,提问作者Sanket
相关产品推荐
相关产品推荐

