在内部查询之后使用“where”条件时出现意外输出

时间:2014-10-07 11:06:41

标签: sql-server tsql

我正在尝试查询,但它返回了一个我无法解释的错误。 (第5次查询)。
有人可以帮助我理解导致错误的原因。

DROP TABLE #temp  

SELECT * INTO #temp  
FROM  
(  
SELECT 'A_100' Col  
union all  
SELECT 'A_101'   
union all  
SELECT 'A_102'  
union all  
SELECT 'A_103'  
union all  
SELECT 'A_104'  
union all  
SELECT 'B_104'  
) a  

-- 1
SELECT * FROM #temp where col like 'A%'
     
-- 2
SELECT replace(col,'A_','')  FROM #temp where col like 'A%'
     
--3
SELECT cast(replace(col,'A_','') as INT) FROM #temp where col like 'A%'     

-- 4
SELECT * FROM
(
SELECT cast(replace(col,'A_','') as INT) Num
 FROM #temp a where col like 'A%'
) A
     
-- 5
SELECT * FROM
(
SELECT cast(replace(col,'A_','') as INT) Num
 FROM #temp a where col like 'A%'
) A
WHERE A.Num>102

2 个答案:

答案 0 :(得分:1)

@Sayuri这不能解决错误,OP确实做了检查,错误不应该发生。

这也不是导致错误的原因,因为SELECT replace(col,'A_','') from #temp where col like 'A%'正确输出100,101,102,103,104有一些不应该被缓存的东西。如果它首先拆分为新的#tmp表而不是嵌套的select,那么它可以正常工作。

SELECT replace(col,'A_','') [Num]
INTO #tmp 
FROM #temp b 
WHERE col LIKE 'A%'

SELECT [Num]
FROM #tmp 
WHERE [Num] > 101

完整的可运行代码

SELECT *
INTO #temp
FROM (
    SELECT 'A_100' Col
    UNION ALL
    SELECT 'A_101'
    UNION ALL
    SELECT 'A_102'
    UNION ALL
    SELECT 'A_103'
    UNION ALL
    SELECT 'A_104'
    UNION ALL
    SELECT 'B_104'
    ) a


SELECT cast(replace(col, 'A_', '') as int) Num
INTO #tmp
FROM #temp b
WHERE col LIKE 'A%'

SELECT *
FROM #tmp
WHERE Num > 101

DROP TABLE #tmp
DROP TABLE #temp

答案 1 :(得分:0)

好的,问题在于此。

您的查询如下: SELECT cast(替换(col,' A _','')为INT)Num FROM #temp a col like' A%'

它首先尝试替换col" A _"匹配' A%'并将其转换为INT。现在,因为' b_104'不满足第一个标准,如A' A%&#39 ;;更换不会发生;因此转换为INT失败。您可以尝试执行以下操作并亲自查看输出:

                      SELECT replace(col,'A_','') from #temp where col like 'A%'

然后在#temp

上尝试选择*