今天遇到了一个奇怪的问题:
sql如下
SELECT
P .*, d1.dicName noticeTypeName
FROM
pro_purnotice P
LEFT JOIN (
SELECT
dicValue,
dicName
FROM
dictionarydata D
WHERE
dicCategorID = (
SELECT
ID
FROM
dictionarycategory c
WHERE
c.categoryCode = 'noticeType'
AND c.purchaserNo = 'CG5008'
)
) d1 ON P .noticeType = d1.dicValue
WHERE
purchaseNo = 'CG5008'
AND p.NOTICETYPE = 1
ORDER BY
ID DESC
p.NOTICETYPE = 1
会报错,但是p.NOTICETYPE = 2
不会报错!
这到底是为什么?
在pro_purnotice
表中,NOTICETYPE
是number
类型,讲道理不会有问题啊。
但是 我发现 在dictionarydata
表中dicValue
是varchar2
类型,如果
这样P .noticeType = d1.dicValue
number
与varchar2
匹配会不会出问题?
但是 运行这个:
SELECT
P .*, d1.dicName noticeTypeName
FROM
pro_purnotice P
LEFT JOIN (
SELECT
dicValue,
dicName
FROM
dictionarydata D
WHERE
dicCategorID = (
SELECT
ID
FROM
dictionarycategory c
WHERE
c.categoryCode = 'noticeType'
AND c.purchaserNo = 'CG5008'
)
) d1 ON P .noticeType = d1.dicValue
WHERE
purchaseNo = 'CG5008'
是没问题的。说明是可以匹配的,那么和dicValue
匹配后的noticeType
值,还是number类型吗?
我是这样想的:
只要和dicValue
匹配的noticeType
值都已经不是number类型了,没有和dicValue
匹配的noticeType
值 ,还是number类型。
因为P .noticeType=1
能够匹配 到 ,但是P .noticeType=2
没有匹配到,所以P .noticeType=2
不会报错。
解决办法:
①P .noticeType = to_number2(d1.dicValue)
②AND to_number2(p.NOTICETYPE) = 1