Shell 检查列中的值是否存在,如果不存在,请创建列

Shell 检查列中的值是否存在,如果不存在,请创建列,shell,oracle11g,Shell,Oracle11g,我需要检查数据库中的一列是否包含特定值。如果没有,我希望使用以下值创建该行: #!/bin/bash # MODEL=$1 if true (SELECT * FROM table.STATISTICS WHERE MODEL = '$MODEL' ) do this (INSERT INTO table.STATISTICS('$MODEL',0,SYSDATE,0,SYSDATE,0); ) get_count(){ sqlplus-s username/pass您可

我需要检查数据库中的一列是否包含特定值。如果没有,我希望使用以下值创建该行:

#!/bin/bash
#
MODEL=$1

if true (SELECT * FROM table.STATISTICS
         WHERE MODEL = '$MODEL' )

do this (INSERT INTO table.STATISTICS('$MODEL',0,SYSDATE,0,SYSDATE,0); )
get_count(){

sqlplus-s username/pass您可以使用
合并
为此,将SQL*Plus作为“herdeoc”运行,这样您就不必执行单独的计数操作;
合并
将有效地为您执行此操作:

#!/bin/bash

MODEL=$1

sqlplus -s /nolog <<!EOF

connect user/pass

merge into statistics s
using (select '${MODEL}' as model, 0 as num1, sysdate as date1,
  0 as num2, sysdate as date2 from dual) t
on (s.model = t.model)
when not matched then
insert (s.model, s.num1, s.date1, s.num2, s.date2)
values (t.model, t.num1, t.date1, t.num2, t.date2);

!EOF
!/bin/bash
型号=$1
sqlplus-s/nolog

但是很明显,使用真实的列名。即使对于普通的
插入

,也最好在此处使用
-ge 0
显式列出列名;这种情况永远都是正确的(即使它一直使用名称-应该是
count
还是
model\u count
),所以它总是会这样做(或尝试)insert.
count
要么是零,要么大于零,要么是像null这样的奇数(您将其视为零)或者错误消息的一部分。它永远不会是否定的。因此,您可能想在那里测试
-eq 0
。并且您的插入中缺少
关键字。我不确定您是否将此作为真实答案发布,或者它是否应该是问题的一部分。我做了更改,但我采用了您的方法。谢谢@AlexPoole
#!/bin/bash

MODEL=$1

sqlplus -s /nolog <<!EOF

connect user/pass

merge into statistics s
using (select '${MODEL}' as model, 0 as num1, sysdate as date1,
  0 as num2, sysdate as date2 from dual) t
on (s.model = t.model)
when not matched then
insert (s.model, s.num1, s.date1, s.num2, s.date2)
values (t.model, t.num1, t.date1, t.num2, t.date2);

!EOF