我想检查数据库表中是否存在一行。我首先使用了这种方法:
type MyStruct struct {
ID uint32
Key string
Value string
}
var result MyStruct
err := db.
Where("id = ? AND `key` = ? AND `value` = 0", myID, myKey).
First(&result).
Error
if err != nil {
if err == gorm.ErrRecordNotFound {
logrus.Error("ErrRecordNotFound")
}
logrus.Errorf("Other DB error: %s", err.Error())
}
Run Code Online (Sandbox Code Playgroud)
但我想通过编写原始 SQL 来实现这一点。我尝试了以下操作:
var result bool
db.Raw("SELECT EXISTS(SELECT 1 FROM my_table WHERE id = ? AND `key` = ? AND `value` = ?)",
myID, myKey, "0").Scan(&result)
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
unsupported destination, …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种更有效的方法来完成这项任务.我需要设置一个等于ID的变量(如果存在),如果不存在,则将变量设置为插入的标识.我可以通过执行以下操作来实现此目的:
@VariableName --sent through to stored procedure
DECLARE @VariableID [int]
IF EXISTS(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
SET @VariableID = (SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
ELSE
INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
SET @VariableID = SCOPE_IDENTITY();
END
Run Code Online (Sandbox Code Playgroud)
但是,运行相同的查询两次似乎效率低下(检查是否存在以及是否设置了变量)
只是寻找更好的方法来完成这项任务的建议.
我究竟做错了什么?从我的测试中,objDic.exists永远不会给出错误!
dim objDic
set objDic = createobject("scripting.dictionary")
objDic.add "test","I have not been deleted"
wscript.echo objDic.item("test") 'Displays -- I have not been deleted
objDic.remove "test"
wscript.echo """" & objDic.item("test") & """" 'Displays -- ""
if objDic.exists("test") then wscript.echo """" & objDic.item("test") & """" 'Displays -- ""
Run Code Online (Sandbox Code Playgroud) 是否可以EXISTS
在单个IF
SQL语句中测试两个条件?我尝试了以下内容.
IF EXIST (SELECT * FROM tblOne WHERE field1 = @parm1 AND field2 = @parm2)
OR
EXIST (SELECT * FROM tblTwo WHERE field1 = @parm5 AND field2 = @parm3)
Run Code Online (Sandbox Code Playgroud)
我试过IF
在那里添加额外的括号,但无济于事.
你能用正确的语法帮助我吗?
我尝试建立一个if语句来检查是否已经创建了一个表.我只想创建一个表,但现在我每次单击按钮存储信息时都会创建一个表.有什么建议?
DataTable dt;
private void InitDataTable()
{
if () {
}
dt = new DataTable();
DataSet ds = new DataSet();
ds.ReadXml("gjesteInfo.xml");
ds.Tables.Add(dt);
DataColumn dc1 = new DataColumn("Fullt navn");
DataColumn dc2 = new DataColumn("Start dato");
DataColumn dc3 = new DataColumn("Antall dager");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
ds.Merge(dt);
ds.WriteXml("gjesteInfo.xml");
}
private void lagre_Click(object sender, EventArgs e)
{
InitDataTable();
gjesterutenrom.Items.Add(gjestenavnInput.Text);
gjestenavnInput.Text = "";
datoInnsjekk.Text = "";
antallDager.Text = "";
DataSet onClick = new DataSet();
onClick.ReadXml("gjesteInfo.xml");
lagredeGjester.DataSource = onClick.Tables[0];
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用名为lagredeGjester的DataGridView来查看存储在XLM中的信息.
更新的问题:
现在我写了这样的代码: …
我正在尝试检查SQLite3数据库中是否存在变量.不幸的是,我似乎无法让它工作.机场表包含3个列,其中ICAO作为第一列.
if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True:
print("Found!")
else:
print("Not found...")
Run Code Online (Sandbox Code Playgroud)
代码运行时没有任何错误,但结果始终相同(未找到).
这段代码有什么问题?
我有分贝和db B.在一个存储过程,我想从备份的所有行的开头B.mytable
来B.mytablebackup
.存储过程的其余部分针对db A上的表运行(它收集数据并将其写入B.mytable
).
所以我检查一下是否B.mytablebackup
存在
IF EXISTS(SELECT 1 FROM B.dbo.mytablebackup)
Run Code Online (Sandbox Code Playgroud)
如果是,则存储过程执行
INSERT INTO B..mytablebackup SELECT * FROM B..mytable
Run Code Online (Sandbox Code Playgroud)
如果它不存在它会做
SELECT * INTO B..mytablebackup from B..mytable
Run Code Online (Sandbox Code Playgroud)
但是当我执行存储过程时,我得到了错误
数据库中已经有一个名为"mytablebackup"的对象
我添加了一个Print
语句,执行正在采用IF的"不存在"分支.
我究竟做错了什么?
问题
我试图理解为什么在这两个Oracle语法更新查询中看起来微不足道的原因导致执行计划完全不同.
查询1:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select *
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
查询2:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select rownum
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两者之间的唯一区别是查询2中的子查询返回rownum而不是每行的值.
这两者的执行计划不可能更加不同:
Query1 - 从两个表中提取总结果,并使用sort和hashjoin返回结果.这有利于2,346的成本(尽管使用了EXISTS条款和有凝聚力的子查询).
Query2 - 同时拉取两个表结果,但使用计数和过滤器来完成相同的任务,并以惊人的77,789,696成本返回执行计划!我应该注意到他的查询只是挂在我身上所以我实际上并不是肯定的,这会返回相同的结果(尽管我相信它应该).
根据我对Exists子句的理解,它只是一个简单的布尔检查,它运行在主表的每一行.如果在我的EXISTS条件中返回单行或100,000行也没关系...如果为正在运行的行返回任何结果,那么您已经通过了存在检查.那么为什么我的子查询SELECT语句返回的重要性呢?
- - - - - - - - - …
如果表中已存在某个数字,则我想返回1,否则返回0.
我尝试了一些但它不起作用:
select
case when 100 in (select distinct id from test) then '1'
else '0'
from test
Run Code Online (Sandbox Code Playgroud)
我想要的东西,类似存在已经存在于PostgreSQL的功能,但不是true
和false
我想要1
或0
.
这是一个学校作业,但我即将发布的所有内容都是由我和我完成的.因此,我只需要你的帮助,在我的任务中迈出一小步,我就被卡住了.
let rec removeDuplicates2 xs =
match xs with
|[]->[]
|y::ys -> if y = (List.exists y ys) then
(removeDuplicates2 ys)
else
y::(removeDuplicates2 ys)
printfn "%A" (removeDuplicates2 [3;1;3;2;1]) // result must be [3;1;2]
Run Code Online (Sandbox Code Playgroud)
我需要帮助的是制作if语句来检查元素y是否是列表ys的成员
目前我得到错误说:"这个表达式预计会有'a - > bool'类型,但这里有'bool'类型"
谁能告诉我我做错了什么?
exists ×10
sql ×3
sql-server ×2
boolean ×1
c# ×1
conditional ×1
datagridview ×1
datatable ×1
dictionary ×1
elements ×1
f# ×1
go ×1
go-gorm ×1
if-statement ×1
list ×1
oracle ×1
postgresql ×1
python-3.x ×1
readxml ×1
rownum ×1
sqlite ×1
t-sql ×1
vbscript ×1