我的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种不同的数据类型,但是我接管了现有的数据库,所以我真的没有选择。
答案 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
,则查询无法使用该列的索引。