前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cockroachDB postgreSQL的array_position没找到的话返回NULL

cockroachDB postgreSQL的array_position没找到的话返回NULL

作者头像
xiny120
发布2020-04-01 21:20:15
1.7K0
发布2020-04-01 21:20:15
举报
文章被收录于专栏:毛毛v5毛毛v5

在array_position和array_positions中, 每个数组元素与使用IS NOT DISTINCT FROM语法的搜索值进行比较。

在array_position中,如果没有找到该值,则返回NULL。

在array_positions中,如果数组是NULL,则返回NULL; 如果数组中没有找到该值,相反返回空数组。

在string_to_array中,如果定界符参数为 NULL,输入字符串中的每一个字符将变成结果数组中的一个独立元素。如果定界符是一个空串,则整个输入字符串被作为一个单一元素的数组返回。否则输入字符串会被在每一个出现定界符字符串的位置分裂。

在string_to_array中,如果空值串参数被忽略或者为 NULL,输入中的子串不会被替换成 NULL。在array_to_string中,如果空值串参数被忽略或者为 NULL,该数组中的任何空值元素会被简单地跳过并且不会在输出串中被表示。

没有找到这样表示

代码语言:javascript
复制
array_position(days,:day) is null

完整的代码

代码语言:javascript
复制
function signinAppend($param,&$arr,$token,$ui){
    $dbh = new PDO(CRDB, CRDB_U, CRDB_P, array(
        PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => true,
        PDO::ATTR_PERSISTENT => true
    ));
    try{
        $keys = ["year","month","day"];
        if(checkParam($keys,$param)){
            $year = $param["year"];
            $month = $param["month"];
            $day = (int)$param["day"];
        }else{
            $year = Date("Y");
            $month =  Date("m");
            $day =  (int)Date("d");
        }

        try {
            $dbh->beginTransaction();
            $dbh->exec("SAVEPOINT cockroach_restart_signin");// This savepoint allows us to retry our transaction.
        } catch (Exception $e) {
            $arr["msg"] = "signinAppend transation开始失败";
            return;
        }
        $n = 0;
        $maxretry = 3;
        while (true) {
            try {
                if($n++ > $maxretry){
                    throw new Exception("transation重试次数超标");
                }
                $stmt = $dbh->prepare('select id from signin WHERE userid=:userid and year=:year and month=:month');
                $stmt->bindValue(':userid', $ui["id"], PDO::PARAM_INT);
                $stmt->bindValue(':year', $year, PDO::PARAM_INT);
                $stmt->bindValue(':month', $month, PDO::PARAM_INT);
                $stmt->execute();
                if ($stmt->rowCount() <= 0) {//没有该月份数据,插入。
                    $arr["msg"] = "签到成功";
                    $stmt = $dbh->prepare(
                        'insert into signin(userid,year,month,days) values(:userid,:year,:month,:day)'
                    );
                    $stmt->bindValue(':userid', $ui["id"], PDO::PARAM_INT);
                    $stmt->bindValue(':year', $year, PDO::PARAM_INT);
                    $stmt->bindValue(':month', $month, PDO::PARAM_INT);
                    $stmt->bindValue(':day', '{'.$day.'}', PDO::PARAM_STR);
                    $stmt->execute();
                    if($stmt->rowCount() <=0){
                        throw new Exception("测试异常2");
                    }
                }else{
                    $arr["msg"] = "签到成功";
                    $stmt = $dbh->prepare(
                        'update signin set days=array_append(days,:day) where userid=:userid and year=:year and month=:month and array_position(days,:day) is null'
                    );
                    $stmt->bindValue(':day', $day, PDO::PARAM_STR);   
                    $stmt->bindValue(':userid', $ui["id"], PDO::PARAM_INT);
                    $stmt->bindValue(':year', $year, PDO::PARAM_INT);
                    $stmt->bindValue(':month', $month, PDO::PARAM_INT);
                    $stmt->execute();
                    if ($stmt->rowCount() <= 0) {//没有该月份数据,插入。
                        $arr["msg"] = "重复签到";    
                    }
                }
                $dbh->exec('RELEASE SAVEPOINT cockroach_restart_signin');// Attempt to release the savepoint (which is really the commit).
                $dbh->commit();
                $arr["status"] = 1;
                break;
            }catch(Exception $e0){
                $dbh->rollBack();
                $arr["msg"] = $e0->getMessage();
                return;  
            }catch (PDOException $e) {
                if ($e->getCode() != '40001') {// Non-recoverable error. Rollback and bubble error up the chain.
                    $dbh->rollBack();
                    $arr["msg"] = "userRegister error 2";
                    return;   
                } else {// Cockroach transaction retry code. Rollback to the savepoint and restart.
                    $dbh->exec('ROLLBACK TO SAVEPOINT cockroach_restart_signin');
                }
            }
 
        }
    }catch(Exception $e){
        $arr["msg"] = $e->getMessage();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档