0

嘿,我有以下查询:

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;

它返回记录..

电话号码的格式如下:

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

我所做的只是去掉电话号码中的- ( ) 和 [空格],以确保我得到了我应该得到的所有记录。我知道两个表中都有匹配项,因此取出- ( ) 和 [space]仍应导致返回记录。

更新

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

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;
4

1 回答 1

1

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

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

于 2012-10-26T16:36:39.733 回答