und*_*e_d 2 sql sql-server string isnull nullif
我是一个自学成才,模糊的SQL用户.对于我正在编写的视图,我正在尝试开发一个"条件LEFT"字符串拆分命令(可能后来加入'条件RIGHT' - 其中:
所以,如果我们的模式是' - ',
我试图提出一种方法,避免重复任何条款(例如if 0 < CHARINDEX,然后采取CHARINDEX-1等),而不是使用最粗略的方法来实现这一点NULL.
然而 - 这就是我想要创造性的东西 - 我已经达到了似乎是一个非常基本的绊脚石.请注意以下代码和结果,并让我知道您是否可以复制它 - 因此它是否是一个错误或我错过了一些特殊的东西.我已经在2008 R2和2014的SQL Server上测试过这两款Express版本.
select
-- ISNULL: returns 'a big old string'
ISNULL(null, 'a big old string'),
-- NULLIF: returns NULL
left(
'a big old string',
nullif
(
CHARINDEX
(
'needle',
'haystack'
), 0
) - 1
),
-- combined: returns just 'a' (1st character of ISNULL condition)
ISNULL(
left
(
'a big old string', -- the input string. In reality, this would be a column alias, etc.
nullif
(
CHARINDEX -- Search for the splitting pattern
(
'needle',
'haystack'
), 0 -- If it's not found, return NULL instead of the usual 0
) - 1 -- so that this subtraction produces a NULL, not an invalid negative index
),
'a big old string' -- If the pattern was not found, we should return the input unaltered
);
/*
---------------- ---- ----
a big old string NULL a
(1 row(s) affected)
*/
Run Code Online (Sandbox Code Playgroud)
为什么这些条款2按预期的隔离,但是当我将它们结合起来,而不是让他们的效果的总和,我只得到了第1个字符的的ISNULL字符串- "A"?
有某种隐含CAST的varchar(1)吗?故意cast荷兰国际集团,以varchar(max)没有区别.还有什么可以发生在这里?
我只是在做一些非常愚蠢的事情吗?因为从这里开始,我无法弄清楚我做错了什么,所以它看起来像是一个错误.我希望2014年的测试能证明它是旧版2008 R2中的一个错误,但唉,它们的行为相同(或者说,不是).
提前感谢,希望能够让我远离那可能是一个令人困惑的存在危机的夜晚.
这之间的区别isnull和coalesce-和因为你的第一个ISNULL参数是char(1),这将是该语句的返回值的类型.通过合并,您将获得正确的结果.
返回与check_expression相同的类型.如果提供了一个文字NULL作为check_expression,则返回replacement_value的数据类型.如果提供了一个文字NULL作为check_expression并且没有提供replacement_value,则返回一个int.
合并:
返回具有最高数据类型优先级的表达式的数据类型.如果所有表达式都不可为空,则结果将输入为nonnullable.
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |