2011-08-10 4 views
2

이 문제가 해결되도록 고민하고 있거나 누군가가 분명한 실수를 지적 할 수 있습니다. 난 그냥 너희들이 광기를보고 싶은 긴 목록에 대한왜 내 SQL 쿼리가 서로 일치하지 않습니까?

SELECT HIDEORSHOW FROM tblProspects WHERE PROSPECT_ID = 1261484;

HIDEORSHOW 
1 

SELECT PROSPECT_ID FROM tblProspects WHERE HIDEORSHOW = 1;

PROSPECT_ID 
196248 
199004 
204190 
204338 
210918 
211932 
213332 
214186 
216980 
218254 
222420 
223578 
223824 
224429 
224390 
224672 
224714 
227031 
227481 
228363 
230040 
238168 
239230 
240790 
241409 
243827 
244553 
245785 
247947 
248349 
250426 
250640 
252399 
252555 
253610 
253949 
254641 
255109 

죄송합니다 :

나는 두 개의 쿼리가 있습니다. 이것이 일어날 어떤 이유가 있습니까? 내가 알고있는 또 다른 잠재 고객이 있습니다 (1257506).이 값은 HIDEORSHOW이며 목록에 표시되지 않습니다.

+2

ID가 999999를 초과하여 표시되지 않습니까? –

+0

HIDEORSHOW의 열 유형은 무엇입니까? 숫자가 아닌 문자열이며 실제로 공백을 포함 할 수 있습니다. 당신은 우리에게 칼럼의 유형을 말할 수 있습니까? – nycynik

+0

HIDEORSHOW가 ENUM ('0', '1')으로 정의되었는지 확인하고, 문자열 '1'을 사용하도록 SQL 문을 수정하면 올바른 결과를 얻을 수 있습니다. 왜 내가 1과 1을 사용할 수 있는지에 대한 수수께끼를 정리해야 할 것입니다. – David

답변

2

나는 HIDEORSHOW 필드가 어떤 종류의 문자열이며, 일부 값에는 선행 또는 후행 공백이 있다는 것이 좋을 것입니다. 이를 테스트하려면

This is true, due to implicit CASTing:  '1' = 1  (Becomes : '1' = '1') 
This is false, even with implicit CASTing: ' 1' = 1  (Becomes : ' 1' = '1') 


,이 쿼리 (또는는 SQL의 버전에 해당하는 'S) ...

SELECT PROSPECT_ID FROM tblProspects WHERE CAST(HIDEORSHOW AS INT) = 1; 

이것은보다는 string => int가 될 주조를 강제로 다른 방법으로.


아니면이 테스트를 시도 할 수 ...

SELECT '<' + HIDEORSHOW + '>', LEN(HIDEORSHOW) FROM tblProspects WHERE PROSPECT_ID = 1261484; 

그런 다음 해당 필드에 정확한 값에 대한 가시성을해야합니다.

+0

아마도 DBMS에 의존합니다. 다음은 SQL Server 2008 R2에서 두 행을 반환합니다. SELECT * FROM (SELECT '1'UNION ALL SELECT '1') s (f) WHERE f = 1' 즉, 문자열이 암시 적으로 숫자로 변환됩니다. . –

관련 문제