我正在尝试查询,但它返回了一个我无法解释的错误。 (第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
答案 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
上尝试选择*