我们在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
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;
至
$string = "null";
我得到这样的陈述:
SELECT * From Table WHERE Feld IS NULL
SELECT * From Table WHERE Feld IS NOT NULL
现在我想知道如何参数化这个查询:
SELECT * From Table WHERE Feld IS :Value
因为我不能将"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 …理论问题......
当触发下面给出的一组查询时...
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
...给...

我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
查询:
declare @ast varchar(10)
set @ast = null
select *
from tbl
where AppType = 'SC' and AppSubType = ISNULL(@ast, AppSubType)
结果:
ID  AppType AppSubType  Factor
1   SC  CD  1.0000000000
2   SC  CD  2.0000000000
题:
此查询不应该返回所有4条记录,而不仅仅是前2条吗?
我的好奇心总是得到我最好的满足,我在网上搜索了对此的解释,但一无所获(可能是因为我没有使用正确的术语。)
有人可以解释一下为什么执行以下命令时SQL Server返回零(0)而不是空字符串('')的原因。
    DECLARE @I AS INT
    SET @I = NULL
    SELECT ISNULL(@I, '') -- 0
我得到了一个非常简单的查询,当在同一硬件上运行Spark SQL和Presto时(3小时vs 3分钟),显示出显着的性能差异。
SELECT field 
FROM test1 
WHERE field NOT IN (SELECT field FROM test2)
经过对查询计划的研究,我发现原因是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
如果MyColumn为null,则此表达式将返回-1作为MyColumn的值.想在SQLite中做类似的事情.
(是的,我知道我可以编写自己的包装函数来处理这个 - 这不是我正在寻找的答案)
TIA
我有一张桌子叫table1
它有 100 列:{ col1, col2, ..., col100}
我了解如何在特定列中不SELECT包含空值的行,例如:col1
SELECT *
FROM table1
WHERE col1 IS NOT NULL
如何处理任何列中不包含空值的
SELECT所有行
SELECT *
FROM table1
WHERE * IS NOT NULL
但这会返回一个错误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