4

我已经搜索并搜索了我的问题的解决方案,即使我找到了一些可能有帮助的方法,但我不确定这是否是满足我需要的正确方法。请记住,我正在学习并且对 SQL 相当陌生。但是我有两个要使用内部联接查询的表。

两个表中都有一个列CAVITY,但它们以不同的格式保存值。一个表将值保存为 H02,而另一个表将值保存为 2。

我想使用 H02 格式在此列上进行内部连接,但不想更新将值保存为单个数字的表(用于数据输入目的)。因此,例如,如果一个表列有 H02 而另一个有 2,我希望它被加入。如果一个表有 H13 和另一个 13,我希望它也是一个连接。所以基本上,我想删除 H 和 0(但前提是有一个 0 直接跟在 H 之后)。除非有办法做相反的事情并从另一个表的结果中添加 H / H0。

example data
table1.cavity   table2.cavity
     H01      =    1
     H02      =    2
     H10      =    10
     H12      =    12

我的查询结果是不是H0版本对我来说并不重要;我只需要加入工作;我最终可以适应任何一个结果。

我正在使用 SQL Server 2005

我有其余的查询,它工作正常;我只需要添加这个额外的连接。请帮忙!任何帮助是极大的赞赏。谢谢

4

3 回答 3

4

REPLACE(REPLACE(cavity,'H0',''),'H','')

第一个删除 H0:

REPLACE(cavity,'H0','')

然后第二个替换任何剩余的 H:

REPLACE(output_of_previous,'H','')

于 2012-10-23T15:58:26.823 回答
0

您可以这样做的一种方法如下:

 from table1 join
      table2
      on cast(substring(table1.cavity, 2, 100) as int) = table2.cavity

(这是假设2table2.cavity 存储为整数的意思。

不过,这是一个很大的警告。您需要注意查询计划。在编写这样的查询时,很容易得到一个使用嵌套循环连接的计划。如果你的桌子很小,这没什么大不了的。然而,即使是中等大小的表也可能产生非常低效的查询计划。

于 2012-10-23T16:01:32.473 回答
0
CREATE FUNCTION [dbo].[RemoveAlphaCharacters](@Temp VarChar( 1000))
RETURNS int
AS
BEGIN
  WHILE PatIndex ('%[^0-9]%', @Temp) > 0
  SET @Temp = Stuff(@Temp, PatIndex('%[^0-9]%', @Temp), 1, '')
  RETURN @Temp
END

可以在这样的连接子句中使用

SELECT a.col1 a, b.col1 b
FROM tablea a JOIN tableb b ON dbo.RemoveAlphaCharacters(a.col1) = b.col1
于 2012-11-10T22:17:36.897 回答