0

我有一个复杂的 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 以便它们都返回,但是由于它在 join 语句中,您如何在开头和某些条件下而不是在其他条件下附加零?

4

3 回答 3

2
SELECT RIGHT('0000' || STR_NBR, 4)
FROM TABLE_A

将表 BCHAR转换为 tinyint 也可以:

SELECT ...
FROM TABLE_A A
JOIN TABLE_B B
  ON A.num = CAST(B.txt AS TINYINT)
于 2012-09-07T19:09:30.073 回答
1

试试 LPAD 功能:

 LPAD(col,3,'0' ) 
于 2012-09-07T19:07:12.443 回答
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
于 2012-09-10T19:14:53.610 回答