我有一个复杂的SQL语句,我需要根据连接匹配两个表。复杂查询的初始部分具有作为Smallint存储在表中的位置编号,第二个表具有存储为CHAR(4)的存储编号。我已经能够将smallint转换为这样的char(4):
CAST(STR_NBR AS CHAR(4)) AND LOCN_NBR
问题在于,因为Smallint会抑制前导'0',所以连接会从LEFT OUTER JOIN的右侧返回空值。
实施例
Table set A(Smallint) Table Set B (Char(4))
| 96 | | 096 |
| 97 | | 097 |
| 99 | | 099 |
| 100 | <- These return -> | 100 |
| 101 | <- These return -> | 101 |
| 102 | <- These return -> | 102 |
我需要添加make以便它们都返回,但是因为它在连接语句中,你如何在开头和某些条件中而不是在其他条件中添加零?
答案 0 :(得分:2)
尝试LPAD功能:
LPAD(col,3,'0' )
答案 1 :(得分:2)
SELECT RIGHT('0000' || STR_NBR, 4)
FROM TABLE_A
将表B的CHAR
投射到tinyint也可以正常工作:
SELECT ...
FROM TABLE_A A
JOIN TABLE_B B
ON A.num = CAST(B.txt AS TINYINT)
答案 2 :(得分:1)
通过执行以下操作,我能够成功地将其匹配以始终获得3位数的位置编号:
STR_NBR最初定义为SmallINT(2) LOCN_NO最初被定义为Char(4)
SELECT ...
FROM TABLE_A AS A
JOIN TABLE_B AS B
ON CAST(SUBSTR(DIGITS(A.STR_NBR),3,3)AS CHAR(4)) = B.LOCN_NO