int를 주석으로 이해 했으므로 문제는 데이터 유형과 관련됩니다.
다음 바이올린은 몇 가지 검사를 보여줍니다 : fiddle. 당신이 int
그것을 비교하는 varchar
열을 쿼리하면
INSERT INTO table1 values ('3888');
INSERT INTO table2 values (' 3888 '); -- extra spaces
INSERT INTO table3 values (3888);
:
첫째, 나는 다음과 같은 세 개의 테이블을 만들었습니다
CREATE TABLE table1 (id varchar(15));
CREATE TABLE table2 (id varchar(15));
CREATE TABLE table3 (id int);
그리고 일부 데이터를 삽입 값이 0이면 varchar
은 암시 적으로 int
으로 캐스팅되고 여분의 공백이 제거됩니다. 다음 예는 3888
를 반환 :
SELECT * FROM table1 WHERE id = 3888;
SELECT * FROM table2 WHERE id = 3888;
을하지만 당신이 JOIN
작동이 경기를하려고하면, 당신은 varchar
와 varchar
를 비교하는 것입니다, 그래서 '3888' = ' 3888 '
은 거짓으로 평가됩니다.
, 당신은
int
(그래서 사용됩니다 캐스트)에 열 중 하나를 변환 할 수 있습니다이 문제를 해결하거나처럼
TRIM()
기능을 사용하려면 :
SELECT *
FROM table1
INNER JOIN table2
ON TRIM(table1.id) = TRIM(table2.id);
참고 : 가능하면 변환 모두 열 int
SARGABLE 쿼리를 얻을 수 있습니다. 인덱스를 사용하면 각 행의 형 변환 (varchar
~ int
)이 성능에 영향을 미칩니다.
이 열의 데이터 형식은 int 또는 numeric입니다. – radar
어떤 값이 실제로 일치합니까? 각각이 3888을 가지고 있기 때문에 정확하게 일치한다는 것을 의미하지는 않습니다 .... –
둘 다 varchar (15) – Anne