当前位置:   article > 正文

达梦8数据库_达梦数据 where if判断

达梦数据 where if判断

达梦8数据库一些目前暂时令我头大的问题以及应对策略

where 条件后面跟case when 条件失效的问题。

例如where case when id is not null then ‘exam_type = 1’ else ‘1 = 1’ end:
按照过去的使用情况来看,这条语句的实际查询条件要么是 where exam_type = 1 要么是 where 1 = 1。
但是结果是都不是,失效。
无法理解,无法解决,只好换一个思路,尝试用if替代一下:
if(id is not null, exam_type = 1,1),但是依然报错(无法解析的成员访问表达式[IF])。
再次尝试优化:
if(id is not null, if(exam_type = 1, 1, 0), 1)
ok成功了。

数据的迁移和备份问题

蚌埠住,实在是蚌埠住,首先,一定切记不要使用SYSDBA去创建模式使用,大坑。
其次,不同版本的客户端导出的dmp文件是没法去用相同的办法复原的。
要么用dts迁移工具迁移,要么用sql脚本去复原。

我的需求是,我需要初始正式环境的数据,我的问题是,我无法用可视化界面连接到正式环境(堡垒机),但是测试环境的达梦数据库版本和正式环境的又不一致,而项目的数据初始化又只能在测试环境进行,所以我只能在测试环境做成备份文件去正式环境还原。
dts可视化界面没法用(x),不可抗力,无法直接连接到正式环境。
sql脚本复原不想用(x),导出的文件太大,哪怕压缩也有3个GB多,不太想用。
笨办法:
在本地的虚拟机上装一个和正式环境一模一样的达梦数据库,然后利用dts可视化工具,迁移数据到虚拟机上的达梦数据库,然后在达梦数据库上做备份,再拿这个备份文件到正式环境做还原。
指令:
先进入bin目录下,工具都在这个目录

 cd /dmdbs/bin
  • 1

备份指令

./dexp USERID=root/password DIRECTORY=/xxx/backup FILE=exam-20230905-239.dmp SCHEMAS="exam" TABLESPACE=Y DROP=N GRANTS=N NOLOGFILE=Y COMPRESS=Y
  • 1

上面这条指令中,需要自己修改自己的用户名和密码USERID,以及备份文件所在目录DIRECTORY,以及备份文件名FILE,还有需要备份的模式名SCHEMAS,COMPRESS=Y代表开启压缩,节省磁盘空间和传输时间。

还原指令

./dimp USERID=root/password DIRECTORY=/xxx/backup FILE=exam-20230905-239.dmp  IGNORE=N COMPILE=Y INDEXFIRST=N TABLE_FIRST=N COMMIT_ROWS=5000 FAST_LOAD=N LOG=imp.log LOG_WRITE=N
  • 1

和备份指令部分参数相似,注意,这里的还原指令,我没有加SCHEMAS="exam"这条。

group by 的问题

用惯了mysql之后,用其他sql数据库group by很不习惯。
原因嘛,不必多说,在查询的时候可以搭配 exists 关键字使用
例如:

        select *
        from teacher_base a left join teacher_update u on a.id = u.id
        where exists (
            select 1 from (
                select a.id
                from teacher_base a left join teacher_work w on w.teacher_id = a.id
                group by a.id
        ) e
        where e.id = a.id
        )

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

order by 的问题

记录一下一个同事问我的问题
order by的字段的值里存在null的情况的时候,这些null的数据行会排在最上面。
我提供的思路是,按这个字段做一个if判断之后的排序。
例如,假设create_time存在null的情况,做排序

select * from t where 1=1 order by create_time
  • 1

这样就全寄了,create_time为null的数据行肯定在最上面。
修改:

select * from t order by if(create_time is null or length(create_time)<=0 or length(create_time)is null, 1, 0), create_time
  • 1

附上dm官方文档连接:https://eco.dameng.com/document/dm/zh-cn/sql-dev/practice-func.html
----------------------------------------------------------20230908-------------------------------------------------------------

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1006422
推荐阅读
相关标签
  

闽ICP备14008679号