MS SQL REPLACE未显示结果

时间:2012-10-26 16:20:40

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

嘿,我有以下问题:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(tmpTable.Caller_Number,'-',''),'(',''),')',''),' ','') 
FROM tmpTable 
WHERE EXISTS 
(SELECT REPLACE(REPLACE(REPLACE(REPLACE(OnlineAppDetails.addPhone,'-',''),'(',''),')',''),' ','') 
FROM OnlineAppDetails 
WHERE OnlineAppDetails.addPhone = tmpTable.Caller_Number)
ORDER BY GroupsBy ASC;

它不返回任何记录......但是,当我执行此查询时:

SELECT * 
FROM tmpTable 
WHERE EXISTS 
(SELECT * FROM OnlineAppDetails 
WHERE SUBSTRING(OnlineAppDetails.addPhone,2,3)+'-'+SUBSTRING(OnlineAppDetails.addPhone,7,4)+SUBSTRING(OnlineAppDetails.addPhone,11,4) = tmpTable.Caller_Number)
ORDER BY GroupsBy ASC;

它返回记录..

phome编号的格式如下:

for OnlineAppDetails: (xxx) xxx-xxxx
for         tmpTable: xxx-xxx-xxxx

我正在做的就是取出电话号码中的 - ()和[空格] ,以确保我能够归还所有我应该记录的记录。我知道两个表中都有匹配,因此取出 - ()和[space] 仍然会导致返回记录。

更新

Duh ....知道这很简单。

SELECT * 
FROM tmpTable 
WHERE EXISTS 
(SELECT * 
FROM OnlineAppDetails 
WHERE  REPLACE(REPLACE(REPLACE(REPLACE(OnlineAppDetails.addPhone,'-',''),'(',''),')',''),' ','') = REPLACE(REPLACE(REPLACE(REPLACE(tmpTable.Caller_Number,'-',''),'(',''),')',''),' ',''))
ORDER BY GroupsBy ASC;

1 个答案:

答案 0 :(得分:1)

确保第一个查询不会返回任何行:
这是因为,内部查询的WHERE OnlineAppDetails.addPhone = tmpTable.Caller_Number部分将产生零行(给定相应字段的期望格式),因此EXISTS将始终为假。
注意BTW,在 SELECT 部分(实际上是任何)EXISTS子查询中完成的字符串操作不会对EXISTS谓词的结果产生任何影响;这就是为什么使用的习语通常是:... WHERE EXISTS * FROM ...

第二个查询查询有效,因为在WHERE子句中应用了字符串转换。此转换使OnlineAppDetails.addPhone值具有与tmpTable.Caller_Number格式相同的格式,因此提供了查找匹配的机会。