小编Kau*_*yak的帖子

除零处理方式不同

我不确定之前是否已经回答过这个问题,但我找不到任何答案谷歌搜索在各种数据库中解释这种行为.所以我想我会在这里从专家那里澄清一下.

当我在Oracle,Postgresql,mysql和sql-server中运行此查询时,我得到了不同的结果.

Oracle 11g

select count(1/0) from dual; 
Run Code Online (Sandbox Code Playgroud)

ORA-01476:除数等于零

http://sqlfiddle.com/#!4/e0ee9e/751

SQL-Server 2017

select count(1/0) ;

1
Run Code Online (Sandbox Code Playgroud)

但是select 1/0给出了错误.

遇到零除错误

http://sqlfiddle.com/#!18/2be41/2

http://sqlfiddle.com/#!18/185a6/7

PostgreSQL 9.6

错误:除以零

http://sqlfiddle.com/#!17/340e0/80

Mysql 5.6

select count(1/0) ;

0
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!9/2be41/10

为什么这些差异在实施中?

mysql sql sql-server oracle postgresql

8
推荐指数
2
解决办法
270
查看次数

如何在更新中的 postgres 中将 bigint 转换为带时区的时间戳

有没有办法将 a 投射BIGINT到PostgresTIMESTAMPTIMESTAMP WITH TIME ZONE在 Postgres 中?我需要将数据从BIGINT列复制到TIMESTAMP列。

这是我尝试过的:

update table
set date__timestamp = date__bigint::timestamp 
where foo = 1;
Run Code Online (Sandbox Code Playgroud)

错误:无法将 bigint 类型强制转换为没有时区的时间戳

我将时间戳列更改为带时区列并尝试了以下操作:

update table
set date__timestamp = date__bigint::timestamp with time zone at time zone 'PST' 
where foo = 1;
Run Code Online (Sandbox Code Playgroud)

错误:无法将 bigint 类型转换为带时区的时间戳

update table
set date__timstamp = TO_CHAR(TO_TIMESTAMP(date__bi / 1000), 'DD/MM/YYYY HH24:MI:SS')
where foo = 1;
Run Code Online (Sandbox Code Playgroud)

错误:“date__timestamp”列的类型是没有时区的时间戳,但表达式的类型是文本 提示:您需要重写或转换表达式。

数据看起来像这样。

date_bigint: 20181102
date_timestamp: 2018-11-02 17:00:00.000000
Run Code Online (Sandbox Code Playgroud)

我需要将默认值传递给铸造吗?

sql postgresql datetime

8
推荐指数
2
解决办法
2万
查看次数

Oracle - 在 PIVOT 中聚合 CLOB

我有包含他们的位置权限和这些权限组的大量用户数据。我需要为每个用户做一个只包含 1 行的报告。

其中一组中的每个用户都有很多权限,我需要使用自己的聚合函数LISTAGG_CLOB来生成聚合列表但返回CLOB(超过 4000 个字符)。

此查询为我提供了具有权限的所有用户的列表,但它为每一组创建一行。

select u.NAME,
lpg.NAME,
LISTAGG_CLOB(l.NAME)
from USERS u
left join LOCATION_PERM lp
on lp.USER_ID = u.ID
left join LOCATION l
on l.ID = lp.LOCATION
left join LOCATION_PERM_GROUP lpg
on lpg.ID = lp.GROUP
group by u.NAME, lpg.NAME
Run Code Online (Sandbox Code Playgroud)

我试图对这些数据进行透视,但我无法让它工作,因为 Oracle 不会将我自己的聚合函数识别为聚合函数,并且没有聚合函数(除了LISTAGG太小)用于聚合字符串。

我尝试的示例是:

1)

select * from (
    select u.NAME as USER,
    lpg.NAME as PERM_GROUP,
    LISTAGG_CLOB(l.NAME) as PERMISSIONS
    from USERS u
    left join LOCATION_PERM lp
    on lp.USER_ID = u.ID
    left join …
Run Code Online (Sandbox Code Playgroud)

oracle pivot clob aggregate-functions listagg

5
推荐指数
0
解决办法
1190
查看次数

Oracle 合并而不是插入?

我目前在使用DBI收集路由器接口数据的模块的 perl 脚本中有一个插入语句。它每次都有效,但显然存在唯一约束错误,因为重新运行脚本时存在某些项目。我正在尝试进行合并,但我不确定如何通过不从另一个表中选择数据(如我所见的示例)来进行合并。为了更好地理解,perl 脚本通过运行ssh到设备来收集数据,并将某些信息存储到变量中。例如接口名称将是$interface. 等等。

当前插入语句

$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);
Run Code Online (Sandbox Code Playgroud)

我开始编写合并功能,但我似乎无法理解这是如何工作的,因为所有合并语句都从其他表和匹配数据中进行选择,然后进行更新/插入?下面的示例从 2 个不同的表中选择数据并进行匹配,但是我只查看一个表并希望合并新数据。

MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
 VALUES (S.employee_id, S.salary*.01)
 WHERE (S.salary <= 8000); 
Run Code Online (Sandbox Code Playgroud)

因此,它正在将数据合并到 …

sql oracle perl dbi oracle11g

5
推荐指数
1
解决办法
2980
查看次数

如何在plsql中获取当前日期时间?

我的代码:

DECLARE

BEGIN 

    -- outputs 06-DEC-18
    dbms_output.put_line(sysdate);  

    -- also outputs 18-DEC-06
    dbms_output.put_line(to_date(sysdate,'yyyy-mm-dd hh24:mi:ss')); 
END;
/
Run Code Online (Sandbox Code Playgroud)

输出仅显示日期。我也想赶时间。

oracle plsql

5
推荐指数
1
解决办法
2万
查看次数

使用perl替换除最后一次之外的所有事件

我有一个字符串说"a/b/c/d/e",我想要替换除了最后一个以外的所有/.即我的输出应该是a.b.c.d/e.

如何修改我的替换命令s/\//./g来执行相同的操作?另请注意,层次结构并不总是有4" /".它可以是任何数字.

regex perl substitution regex-greedy

4
推荐指数
1
解决办法
460
查看次数

Oracle SQL - 圆形 - 一半

默认情况下,Oracle ROUND 函数会将“一半向上”四舍五入:

select 3.674 my_number,
       round(3.674,2) round_on_number
from   dual
union
select 3.675 my_number,
       round(3.675,2) round_on_number
from   dual
union
select 3.676 my_number,
       round(3.676,2) round_on_number
from   dual
;

 MY_NUMBER ROUND_ON_NUMBER
---------- ---------------
     3,674            3,67
     3,675            3,68
     3,676            3,68
Run Code Online (Sandbox Code Playgroud)

我需要舍入“一半”,这基本上意味着我应该得到以下结果:

 MY_NUMBER EXPECTED_ROUND_ON_NUMBER
---------- ------------------------
     3,674                     3,67
     3,675                     3,67
     3,676                     3,68
Run Code Online (Sandbox Code Playgroud)

它应该很快,因为我需要对数百万个项目执行此操作。

我可能会检测到数字是否以“5”结尾并在这种情况下截断最后一位数字,否则四舍五入,但我觉得这会效率低下(?)

谢谢 !大卫

sql oracle rounding

4
推荐指数
1
解决办法
1689
查看次数

批处理脚本中的 PostgreSQL 命令自动化

我需要通过批处理作业自动执行以下命令,有没有办法做到这一点。当前命令提示符在执行第一步(psql -U nrgadmin -d enwdb)后停止。在enwdb数据库内部,我需要手动执行从开始到提交的步骤。任何帮助,将不胜感激。

psql -U nrgadmin -d enwdb;

 begin;
 alter schema asset_enw rename to asset_enw_backup;
 alter schema asset_import rename to asset_enw;
 alter table enw.geom rename to geom_backup;
 alter table enw.geom_backup set schema asset_enw_backup;
 alter table import.geom set schema enw;
 commit;
Run Code Online (Sandbox Code Playgroud)

postgresql

4
推荐指数
1
解决办法
1902
查看次数

pl /sql set ORA-00922: set serveroutput on 上的选项缺失或无效;

set serveroutput on;

DECLARE 
 message varchar2(20):= 'Hello, World!';

BEGIN dbms_output.put_line(message); 
END; 
/
Run Code Online (Sandbox Code Playgroud)

oracle plsql

4
推荐指数
1
解决办法
1万
查看次数

如何将空字符串放入 JSON_OBJECT_T 对象中?

我正在尝试JSON_OBJECT_T使用以下代码向 a 添加一个空字符串,但我得到的null是值而不是空字符串。

DECLARE
   V_OBJ JSON_OBJECT_T;
BEGIN
   V_OBJ := JSON_OBJECT_T();
   V_OBJ.PUT('customerAccRef','');
   DBMS_OUTPUT.PUT_LINE(V_OBJ.stringify);
END;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下 json

{"customerAccRef":null}
Run Code Online (Sandbox Code Playgroud)

我想要如下输出

{"customerAccRef":""}
Run Code Online (Sandbox Code Playgroud)

有人可以建议我需要做什么更改才能传递空字符串吗?

oracle json plsql oracle12c oracle18c

3
推荐指数
1
解决办法
4683
查看次数