加入一个varchar类型的列,其中包含字符串和数字

时间:2015-04-22 14:21:59

标签: sql sql-server sql-server-2008 join

我的varchar(50)类型表中有一个列,用于存储单词和ID。 例如,有以下值:50, 95, Example, Testing....

NOT ISNUMERIC(column)时,我可以使用该值。当ISNUMERIC(column)时,我需要与另一个表连接以获取应该选择的值。

我得到了SELECT部分:

SELECT CASE WHEN ISNUMERIC(column) = 1 THEN othertable.Name ELSE column END

现在我在同一场景下只尝试JOIN

LEFT JOIN OtherTable ot ON CAST(column AS INT) = t.Id

这不起作用,因为当列是单词时CAST将不起作用。如果column是一个数字,我真的只需要加入。

我不喜欢使用1列来存储2种不同的数据类型,但是我接管了现有的数据库,所以我真的没有选择。

2 个答案:

答案 0 :(得分:3)

在这种情况下,最好将int转换为varchar然后反过来:

 LEFT JOIN OtherTable ot ON column = cast(t.Id as varchar(10))

答案 1 :(得分:1)

这是case子句中on可能有意义的极少数情况之一。假设你的意思是:

LEFT JOIN OtherTable ot ON CAST(column AS INT) = ot.Id

然后理论上这可以使用othertable.id上的索引。

同样,以下可以使用can index:

LEFT JOIN OtherTable ot
ON ot.id = (case when isnumeric(column) = 1 then CAST(column AS INT) end);

如果您投射ot.id,则查询无法使用该列的索引。