Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Oracle NVL在与/不与CASE语句一起使用时返回不一致结果_Php_Oracle_Case_Oracle18c_Nvl - Fatal编程技术网

Php Oracle NVL在与/不与CASE语句一起使用时返回不一致结果

Php Oracle NVL在与/不与CASE语句一起使用时返回不一致结果,php,oracle,case,oracle18c,nvl,Php,Oracle,Case,Oracle18c,Nvl,有人能帮助我理解为什么oracle db在使用CASE语句时返回不一致的结果吗 SELECT NVL(CASE WHEN '' IS NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD')) a, NVL(CASE WHEN '' IS NOT NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD')) b, NVL(CASE WHEN '' = ''

有人能帮助我理解为什么oracle db在使用CASE语句时返回不一致的结果吗

SELECT NVL(CASE WHEN '' IS NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD')) a,
   NVL(CASE WHEN '' IS NOT NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD')) b,
   NVL(CASE WHEN '' = '' THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD')) c,
   NVL(NULL ,TO_DATE('19010101', 'YYYYMMDD')) d from dual;


我的实际查询使用
TRUNC(NVL(:NEW\u FORM\u TIME\u END,TO\u DATE('19010101','yyyyymmdd'))>=TRUNC(SYSDATE-INTERVAL'2'DAY)
其中
NEW\u FORM\u TIME\u END
可以是空字符串或空值,但我得到了这个错误
ORA-06550:line 240,第91列:PLS-00306:调用'>='ORA-06550:第229行,第9列:PL/SQL:忽略语句时参数的数量或类型错误

让我们分析所有参数:

NVL(CASE WHEN '' IS NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
这应该将
返回到_DATE('19010101','yyyyymmdd')
,因为
'
与Oracle中的
NULL
相同,然后返回
NULL
分支

NVL(CASE WHEN '' IS NOT NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(CASE WHEN '' = '' THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(NULL ,TO_DATE('19010101', 'YYYYMMDD'))
这个函数还应该返回
到_DATE('19010101','yyyyymmdd'),因为
''不是空的
假的
,而
否则返回空的`分支

NVL(CASE WHEN '' IS NOT NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(CASE WHEN '' = '' THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(NULL ,TO_DATE('19010101', 'YYYYMMDD'))
在Oracle中,
''='
转换为
NULL=NULL
,在SQL中,它的计算结果为
NULL
,因此返回'to_DATE('19010101','yyyyymmdd')

NVL(CASE WHEN '' IS NOT NULL THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(CASE WHEN '' = '' THEN NULL ELSE NULL END ,TO_DATE('19010101', 'YYYYMMDD'))
NVL(NULL ,TO_DATE('19010101', 'YYYYMMDD'))

这个表达式还应该返回
TO_DATE('19010101','yyyyymmdd')

您的case表达式的类型是
VARCHAR2
,如果您不提供显式类型,则它是默认类型。
NULL
literal没有类型
NVL(,)
参数应用隐式类型转换。在其他RDBMS中,由于不兼容的类型,您只会得到一个错误。表达式的PL/SQL版本可能也会遇到类似的问题,尽管与查询中显示的问题不完全相同

只要确保你总是比较相同的类型

请尝试以下检查:

选择
NVL(强制转换(当“”为空时,则为空结束日期),日期“1901-01-01”)a,
NVL(强制转换(如果“”不为NULL,则为NULL结束为日期),日期“1901-01-01”)b,
NVL(强制转换(当“=”时为空,则以日期结束),日期“1901-01-01”)c,
NVL(空,日期'1901-01-01')d
来自双重;
或者,从表中创建一个视图,然后检查字典:

将视图v创建为
挑选
NVL(如果“”为空,则为空结束,日期为“1901-01-01”)a,
NVL(如果“”不为空,则为空结束,日期为“1901-01-01”)b,
NVL(当“=”然后为空结束时的情况,日期为“1901-01-01”)c,
NVL(空,截止日期('19010101','YYYYMMDD'))d
来自双重;
选择列名称、数据类型
从所有标签栏
其中,表_name='V'
按列名称排序;
屈服

|COLUMN_NAME|DATA_TYPE|
|-----------|---------|
|A          |VARCHAR2 |
|B          |VARCHAR2 |
|C          |VARCHAR2 |
|D          |DATE     |
谢谢:)我不知道隐式类型转换