我不确定之前是否已经回答过这个问题,但我找不到任何答案谷歌搜索在各种数据库中解释这种行为.所以我想我会在这里从专家那里澄清一下.
当我在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
为什么这些差异在实施中?
有没有办法将 a 投射BIGINT到PostgresTIMESTAMP或TIMESTAMP 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)
我需要将默认值传递给铸造吗?
我有包含他们的位置权限和这些权限组的大量用户数据。我需要为每个用户做一个只包含 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) 我目前在使用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)
因此,它正在将数据合并到 …
我的代码:
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)
输出仅显示日期。我也想赶时间。
我有一个字符串说"a/b/c/d/e",我想要替换除了最后一个以外的所有/.即我的输出应该是a.b.c.d/e.
如何修改我的替换命令s/\//./g来执行相同的操作?另请注意,层次结构并不总是有4" /".它可以是任何数字.
默认情况下,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”结尾并在这种情况下截断最后一位数字,否则四舍五入,但我觉得这会效率低下(?)
谢谢 !大卫
我需要通过批处理作业自动执行以下命令,有没有办法做到这一点。当前命令提示符在执行第一步(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) set serveroutput on;
DECLARE
message varchar2(20):= 'Hello, World!';
BEGIN dbms_output.put_line(message);
END;
/
Run Code Online (Sandbox Code Playgroud) 我正在尝试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 ×7
sql ×4
plsql ×3
postgresql ×3
perl ×2
clob ×1
datetime ×1
dbi ×1
json ×1
listagg ×1
mysql ×1
oracle11g ×1
oracle12c ×1
oracle18c ×1
pivot ×1
regex ×1
regex-greedy ×1
rounding ×1
sql-server ×1
substitution ×1