2011-11-03 68 views
4

在Sybase和MSSqlServer TransactSQL中,当列值为空时,我们有一个函数IsNull(columnName,valueForNull)来返回一个类型化的默认值。我如何在SQLite中复制这个功能?SQLite中的空替换:

实施例TRANSACTSQL:

select IsNull(MyColumn,-1) as MyColumn from MyTable 

如果MyColumn为空时,该表达式将返回-1作为MyColumn的值。想在SQLite中做类似的事情。

(是的,我知道我可以写我自己的包装函数来处理这一点 - 这不是我要找的答案)

TIA

回答

6

您可以使用ifnull

select ifnull(MyColumn,-1) as MyColumn from MyTable 
+1

ifnull(MyColumn,-1)* exactly *回答我的问题。不过,@Larry Lustig给了我们一个完全通用的SQL解决方案,根本没有特殊的功能。 – Vector

2

SQLite的内置函数将会做我认为你在这里尝试的东西。

6

你应该使用标准COALESCE function

select coalesce(MyColumn, -1) as MyColumn from MyTable 

,理解标准的ANSI SQL支持COALESCE因此使用它是一个很好的习惯进入任何数据库。

+1

@Mikey:使用标准的SQL函数是一种破解?朦胧?我认为你错了。 COALESCE是为了返回一组*值*中的第一个非NULL值,该函数不知道(也不应该)列是什么,因为它在* values *而不是* columns *上运行。以上是COALESCE的预期和习惯用法,甚至与[PostgreSQL手册](http://www.postgresql.org/docs/9.0/interactive/functions-conditional.html#AEN15548)中的示例相匹配。使用非标准函数是一种破解,使用标准的SQL函数,因为它打算用于不是破解。 –

+0

+1 - 我收回了我的评论 - 意识到在回家的路上同样的事情 - 不是标准的 - 你可以使用标准语言功能 - 但是因为它检查了一组值,而硬编码值只是另一个值可以是一个集合成员。 – Vector

3

SQL标准的方式来做到这一点是CASE:

SELECT CASE WHEN MyColumn IS NULL THEN -1 ELSE MyColumn END FROM MyTable 

大大高于发动机专用IFNULL更详细,ISNULL,NZ功能,而且更加便于携带。 (或者,正如mu指出的那样,你可以使用更好的COALESCE来实现这一点)。

+0

感谢您提供此信息。 – Vector