Php Oracle NVL在与/不与CASE语句一起使用时返回不一致结果
有人能帮助我理解为什么oracle db在使用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 '' = ''
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 |
谢谢:)我不知道隐式类型转换