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;

レコードを返します。

phome番号は次のようにフォーマットされます。

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

私がしているのは、電話番号の-()と[スペース]を取り出して、必要なすべてのレコードが返されることを確認することだけです。両方のテーブルに一致するものがあることを知っているので、-()と[スペース]を削除しても、レコードが返されるはずです。

アップデート

ええと....それが簡単になることを知っていました。

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句で適用されるため、2番目のクエリクエリは機能します。この変換により、OnlineAppDetails.addPhone値はtmpTable.Caller_Numberの形式と同じ形式になるため、一致するものを見つける機会が提供されます。

于 2012-10-26T16:36:39.733 に答える