我们在SQL Server 2008(SP1) - 10.0.2531.0(X64) - Win2008 SP2(X64)上遇到了一个奇怪的情况.
这是一个重问题:
select t1.id, t2.id
from t1, t2
where
t1.id = t2.ext_id
and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
.... and about 10 more comparisons with Isnull
Run Code Online (Sandbox Code Playgroud)
UPD:比较的所有列(ID除外)是varchar(~30 ... 200)
T1是~130mln行,T2是~300k行.
这些查询相当大的Dev服务器运行~5小时 - 这很慢,但我们能做什么?
虽然我们调查了可能的优化方法 - 我们发现,在上面的查询中将"isnull"更改为"coalesce"可以获得双倍的性能提升 - 并且查询现在可以运行~2小时
UPD:当我们删除所有ISNULL检查并使用时t1.vchCol1 = t2.vchCol1,查询在40分钟后完成.
问题是:这是已知行为,我们应该避免在任何地方使用IsNull吗?
是否有可能转换null为stringPHP?
例如,
$string = null;
Run Code Online (Sandbox Code Playgroud)
至
$string = "null";
Run Code Online (Sandbox Code Playgroud) 我得到这样的陈述:
SELECT * From Table WHERE Feld IS NULL
SELECT * From Table WHERE Feld IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何参数化这个查询:
SELECT * From Table WHERE Feld IS :Value
Run Code Online (Sandbox Code Playgroud)
因为我不能将"NOT NULL"传递给参数,我认为这根本不可能 - 但也许有人知道解决方案吗?谢谢!
有时我的文档有一个具有空值的字段.
for i in v7.find({"eng":{"$exist":True}})我的文档结构的一个例子是这样的:
{ "_id" : ObjectId("50fd55c1161747668078fed6"),
"dan" : "Hr. Hänsch repræsenterede Dem dér .",
"deu" : "Der Kollege Hänsch hat Sie dort vertreten .",
"eng" : "Mr Hänsch represented you on this occasion .",
"fin" : "Kollega Hänsch edusti teitä siellä .",
"ita" : "Il collega Hänsch è intervenuto in sua vece .",
"md5" : "336b9cd1dc01ae0ff3344072d8db0295",
"uid" : 2100986 }
{u'uid': 104,
u'fre': u"Je crois que la pr\xe9vention est d' une importance capitale …Run Code Online (Sandbox Code Playgroud) 理论问题......
当触发下面给出的一组查询时...
Create table Temp1(C1 varchar(2))
Create table Temp2(C1 varchar(2))
insert into Temp1 Values('A'),(NULL),('B')
insert into Temp2 Values('B'),(NULL),('C'),(NULL)
select *from Temp1 A,Temp2 B
where A.C1 <> B.C1
Run Code Online (Sandbox Code Playgroud)
...给...

我A.C1 <> B.C1在Where条款中使用过.

要获得预期结果作为输出,我需要ISNULL(A.C1,'') <> ISNULL(B.C1,'')在该Where子句中使用.
我的问题是为什么我需要ISNULL每次都按预期使用输出,因为NULL它不等于任何字符串数据.
表:
ID AppType AppSubType Factor
1 SC CD 1.0000000000
2 SC CD 2.0000000000
3 SC NULL 3.0000000000
4 SC NULL 4.0000000000
Run Code Online (Sandbox Code Playgroud)
查询:
declare @ast varchar(10)
set @ast = null
select *
from tbl
where AppType = 'SC' and AppSubType = ISNULL(@ast, AppSubType)
Run Code Online (Sandbox Code Playgroud)
结果:
ID AppType AppSubType Factor
1 SC CD 1.0000000000
2 SC CD 2.0000000000
Run Code Online (Sandbox Code Playgroud)
题:
此查询不应该返回所有4条记录,而不仅仅是前2条吗?
我的好奇心总是得到我最好的满足,我在网上搜索了对此的解释,但一无所获(可能是因为我没有使用正确的术语。)
有人可以解释一下为什么执行以下命令时SQL Server返回零(0)而不是空字符串('')的原因。
DECLARE @I AS INT
SET @I = NULL
SELECT ISNULL(@I, '') -- 0
Run Code Online (Sandbox Code Playgroud) 我得到了一个非常简单的查询,当在同一硬件上运行Spark SQL和Presto时(3小时vs 3分钟),显示出显着的性能差异。
SELECT field
FROM test1
WHERE field NOT IN (SELECT field FROM test2)
Run Code Online (Sandbox Code Playgroud)
经过对查询计划的研究,我发现原因是Spark SQL如何处理NOT IN谓词子查询。为了正确处理NOT IN的NULL,Spark SQL将NOT IN谓词转换为Left AntiJoin( (test1=test2) OR isNULL(test1=test2))。
Spark SQL引入OR isNULL(test1=test2)了确保的正确语义NOT IN。
但是,ORLeft AntiJoin连接谓词的唯一可行的物理连接策略Left AntiJoin是BroadcastNestedLoopJoin。在当前阶段,我可以将NOT IN改写为NOT EXISTS来解决此问题。在NOT EXISTS的查询计划中,我可以看到join谓词是Left AntiJoin(test1=test2)为NOT EXISTS(5分钟完成)导致更好的物理联接运算符的原因。
到目前为止,我很幸运,因为我的数据集当前没有任何NULL属性,但是将来可能会具有,而NOT IN的语义正是我真正想要的。
所以我检查了Presto的查询计划,它没有真正提供,Left AntiJoin但SemiJoin与一起使用FilterPredicate = not (expr)。Presto的查询计划没有提供太多信息,例如Spark。
所以我的问题更像是:
我可以假设Presto有更好的物理联接运算符来处理NOT IN操作吗?与Spark SQL不同,它不依赖于连接谓词的重写isnull(op1 = op2)来确保逻辑计划级别中NOT …
在Sybase和MSSqlServer TransactSQL中,我们有一个函数IsNull(columnName,valueForNull),当列值为null时返回一个类型化的默认值.如何在SQLite中复制此功能?
TransactSQL中的示例:
select IsNull(MyColumn,-1) as MyColumn from MyTable
Run Code Online (Sandbox Code Playgroud)
如果MyColumn为null,则此表达式将返回-1作为MyColumn的值.想在SQLite中做类似的事情.
(是的,我知道我可以编写自己的包装函数来处理这个 - 这不是我正在寻找的答案)
TIA
我有一张桌子叫table1
它有 100 列:{ col1, col2, ..., col100}
我了解如何在特定列中不SELECT包含空值的行,例如:col1
SELECT *
FROM table1
WHERE col1 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
如何处理任何列中不包含空值的
SELECT所有行
SELECT *
FROM table1
WHERE * IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
但这会返回一个错误MySQL(我正在使用)
isnull ×10
null ×5
sql ×4
sql-server ×2
t-sql ×2
delphi ×1
mongodb ×1
mysql ×1
parameters ×1
performance ×1
php ×1
presto ×1
pymongo ×1
sqlite ×1
string ×1