Oracle substr(),隐式转换?
Oracle substr(), implicit conversion?
我遇到了 Oracle SQLs substr()
函数的问题。
看起来 substr()
的行为超出了其规定的目的,因此,
substr(some.field, 0, 7) <> '1598200'
哪里
some.field = '1598200, 123456'
在这里发挥作用,
select sum(t.amount)
from ivtransaction t
inner join ivpaymentreminders p on p.transactionid = t.transactionid
left join ivinvoice i on i.invoiceid = t.invoiceid
where substr(p.collectiveinvoiceno, 0, 7) = '1598200'
在 p.collectiveinvoiceno
中,预计会出现 4 条记录:
rownum | p.collectiveinvoiceno
---------------------------------
1 | 1598200
2 | 1598200
3 | 1598200, 123456
4 | 1598200, 456789
但只有第 1 行和第 2 行出现并添加到 sum(t.amount)
。
- 单独测试时,
substr(p.collectiveinvoiceno, 0, 7)
提取正确的值
- 使用
to_char
转换参数的左右两侧没有区别
这是某种隐式转换吗?如果是,如何解决?
感谢任何想法,
英格丽
编辑:事实证明,substr(field, 1, 7) 比较没有捕获 4/4 行,因为目标字符串在第 3 行和第 4 行的后面,而不是前导。我被骗了,因为在应用程序中,目标字符串显示为前导!!我是初学者,所以无论如何这都非常有帮助,感谢您的所有投入。英格丽
substr(p.collectiveinvoiceno, 0, 7)
在SUBSTR中使用0
作为起始位置是不好的做法,你应该使用1
.虽然,文档指出:
If position is 0, then it is treated as 1.
过滤谓词中的SUBSTR
没有问题,它会获取所有4行。
SQL> WITH DATA AS(
2 SELECT '1598200' str FROM dual UNION ALL
3 SELECT '1598200' FROM dual UNION ALL
4 SELECT '1598200, 123456' FROM dual UNION ALL
5 SELECT '1598200, 456789' FROM dual
6 )
7 SELECT str, substr(str, 1, 7) FROM DATA
8 WHERE substr(str, 1, 7) = '1598200';
STR SUBSTR(
--------------- -------
1598200 1598200
1598200 1598200
1598200, 123456 1598200
1598200, 456789 1598200
没有必要使用 TO_CHAR 因为你已经在两边都有字符串数据类型。所以,不存在隐式数据类型转换的问题。查看解释计划:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
Plan hash value: 560839587
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 36 | 8 (0)| 00:00:01 |
| 1 | VIEW | | 4 | 36 | 8 (0)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
| 4 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
| 5 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
| 6 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------
13 rows selected.
But only rows 1 and 2 turn up and add into sum(t.amount)
这取决于JOIN条件。文件管理器谓词工作正常。
我遇到了 Oracle SQLs substr()
函数的问题。
看起来 substr()
的行为超出了其规定的目的,因此,
substr(some.field, 0, 7) <> '1598200'
哪里
some.field = '1598200, 123456'
在这里发挥作用,
select sum(t.amount)
from ivtransaction t
inner join ivpaymentreminders p on p.transactionid = t.transactionid
left join ivinvoice i on i.invoiceid = t.invoiceid
where substr(p.collectiveinvoiceno, 0, 7) = '1598200'
在 p.collectiveinvoiceno
中,预计会出现 4 条记录:
rownum | p.collectiveinvoiceno
---------------------------------
1 | 1598200
2 | 1598200
3 | 1598200, 123456
4 | 1598200, 456789
但只有第 1 行和第 2 行出现并添加到 sum(t.amount)
。
- 单独测试时,
substr(p.collectiveinvoiceno, 0, 7)
提取正确的值 - 使用
to_char
转换参数的左右两侧没有区别
这是某种隐式转换吗?如果是,如何解决?
感谢任何想法,
英格丽
编辑:事实证明,substr(field, 1, 7) 比较没有捕获 4/4 行,因为目标字符串在第 3 行和第 4 行的后面,而不是前导。我被骗了,因为在应用程序中,目标字符串显示为前导!!我是初学者,所以无论如何这都非常有帮助,感谢您的所有投入。英格丽
substr(p.collectiveinvoiceno, 0, 7)
在SUBSTR中使用0
作为起始位置是不好的做法,你应该使用1
.虽然,文档指出:
If position is 0, then it is treated as 1.
过滤谓词中的SUBSTR
没有问题,它会获取所有4行。
SQL> WITH DATA AS(
2 SELECT '1598200' str FROM dual UNION ALL
3 SELECT '1598200' FROM dual UNION ALL
4 SELECT '1598200, 123456' FROM dual UNION ALL
5 SELECT '1598200, 456789' FROM dual
6 )
7 SELECT str, substr(str, 1, 7) FROM DATA
8 WHERE substr(str, 1, 7) = '1598200';
STR SUBSTR(
--------------- -------
1598200 1598200
1598200 1598200
1598200, 123456 1598200
1598200, 456789 1598200
没有必要使用 TO_CHAR 因为你已经在两边都有字符串数据类型。所以,不存在隐式数据类型转换的问题。查看解释计划:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
Plan hash value: 560839587
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 36 | 8 (0)| 00:00:01 |
| 1 | VIEW | | 4 | 36 | 8 (0)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
| 4 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
| 5 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
| 6 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------
13 rows selected.
But only rows 1 and 2 turn up and add into sum(t.amount)
这取决于JOIN条件。文件管理器谓词工作正常。