MySql 查询到 Postgres 查询。 Postgres 不支持 IF 条件

Posted

技术标签:

【中文标题】MySql 查询到 Postgres 查询。 Postgres 不支持 IF 条件【英文标题】:MySql Query to Postgres Query. Postges Not supporting IF Condition 【发布时间】:2016-06-08 02:52:05 【问题描述】:

我打算将我的 laravel 应用程序数据库 mysql 更改为 postgres。我正在使用原始查询 这是我的查询:

select IF (modelno="" OR modelno IS NULL,name,concat(name, " / ",modelno)) as name, id from `models` where `deleted_at` is null order by `name` asc

当我将此查询用于 postgres 时,引发以下异常。

"""" 行 1 处或附近的零长度分隔标识符:选择 IF (modelno="" OR modelno IS NULL,name,concat(name, '...

我的 larvel 控制器代码如下,并且可以在 MySql 上正常工作:

DB::table('models')
    ->select(DB::raw('IF (modelno="" OR modelno IS NULL,name,concat(name, " / ",modelno)) as name, id'))
    ->orderBy('name', 'asc')
    ->whereNull('deleted_at')
    ->lists('name', 'id');

【问题讨论】:

【参考方案1】:

我不认为 postgres 支持 IF,所以试试 CASE :

DB::table('models')
    ->select(DB::raw('CASE WHEN modelno="" OR modelno IS NULL then name else concat(name, " / ",modelno) as name, id'))
    ->orderBy('name', 'asc')
    ->whereNull('deleted_at')
    ->lists('name', 'id');

【讨论】:

谢谢。但案例陈述对我不起作用。 where 子句解决了我的问题。【参考方案2】:

Postgres 不支持查询中的IF 语句。 但是这个问题的解决方案可以通过where类来处理。

这里是示例:

DB::table('models')
    ->select(DB::raw("concat(name, modelno) as name, id"))
    ->orderBy('name', 'asc')
    ->where('modelno','=','')
    ->whereNull('deleted_at')
    ->orWhereNull('modelno')
    ->lists('name', 'id');

【讨论】:

以上是关于MySql 查询到 Postgres 查询。 Postgres 不支持 IF 条件的主要内容,如果未能解决你的问题,请参考以下文章

将使用 GROUP BY 的查询从 MySQL 转换为 Postgres 和 SQLite

MYSQL 从项目经理的一次查询,到MYSQL 查询语句优化方法多

HQL语句只查询一个字段返回啥值比如 Select name from PO;

Spring Batch - 无法在 Postgres 上创建元数据表并将实际数据加载到 mysql

升级到版本 11 后 Postgres 查询产生高磁盘 IO

建立从 Postgres 到 Power bi 的直接查询连接