여러 열이 있는 SQL Server의 'In' 절
제공된 키를 기반으로 데이터베이스에서 데이터를 검색하는 구성 요소가 있습니다.하지만 저는 제 자바 애플리케이션이 모든 키에 대한 모든 데이터를 한 번의 데이터베이스 히트로 가져와서 모든 것을 묶기를 원합니다.나는 키가 하나밖에 없을 때 'in' 절을 사용할 수 있습니다.
두 개 이상의 키를 작업하는 동안 아래 쿼리를 오라클에서 사용할 수 있습니다.
SELECT * FROM <table_name>
where (value_type,CODE1) IN (('I','COMM'),('I','CORE'));
쓰는 것과 비슷한 것.
SELECT * FROM <table_name>
where value_type = 1 and CODE1 = 'COMM'
그리고.
SELECT * FROM <table_name>
where value_type = 1 and CODE1 = 'CORE'
함께.
그러나 위와 같이 'in' 절을 사용하는 이 개념은 'SQL server'에서 아래와 같은 오류를 주고 있습니다.
ERROR:An expression of non-boolean type specified in a context where a condition is expected, near ','.
SQL Server에서 동일한 작업을 수행할 수 있는 방법이 있는지 알려주시기 바랍니다.
이 구문은 SQL Server에 없습니다.다음의 조합 사용And
그리고.Or
.
SELECT *
FROM <table_name>
WHERE
(value_type = 1 and CODE1 = 'COMM')
OR (value_type = 1 and CODE1 = 'CORE')
value_type은 두 조합 모두에서 동일한 값과 비교되므로 이 값을 더 짧게 만들 수 있습니다.여러 필드가 있는 오라클에서 IN처럼 작동하는 패턴을 보여주고 싶었습니다.)
하위 쿼리와 함께 IN을 사용할 경우 다음과 같이 변경해야 합니다.
오라클:
SELECT *
FROM foo
WHERE
(value_type, CODE1) IN (
SELECT type, code
FROM bar
WHERE <some conditions>)
SQL 서버:
SELECT *
FROM foo
WHERE
EXISTS (
SELECT *
FROM bar
WHERE <some conditions>
AND foo.type_code = bar.type
AND foo.CODE1 = bar.code)
경우에 따라 내부 결합 등 다른 방법이 있습니다.
확인할 튜플이 1000개 미만이고 SQL Server 2008+를 사용하는 경우 테이블 값 생성자를 사용하여 조인을 수행할 수 있습니다.테이블 값 생성자에는 최대 1000개의 행만 지정할 수 있으므로 1000개의 튜플 제한이 있습니다.다음은 귀사의 상황을 보여주는 방법입니다.
SELECT <table_name>.* FROM <table_name>
JOIN ( VALUES
('I', 'COMM'),
('I', 'CORE')
) AS MyTable(a, b) ON a = value_type AND b = CODE1;
값 목록이 고유한 경우에만 이 방법을 사용하는 것이 좋습니다. 그렇지 않으면 값이 중복됩니다.많은 AND 및 OR을 사용하는 것과 비교하여 성능이 어떤지는 잘 모르겠지만, 제 생각에 SQL 쿼리는 적어도 훨씬 더 보기 쉽습니다.
JOIN 대신 EXIST를 사용하기 위해 이 문서를 작성할 수도 있습니다.이렇게 하면 성능 특성이 다를 수 있으며 값이 고유하지 않으면 중복 결과가 생성되는 문제를 피할 수 있습니다.어떤 것이 더 잘 맞는지 확인하기 위해 사용 사례에 대해 EXPACE와 JOIN을 모두 시도해 볼 가치가 있을 수 있습니다.EXIST의 모습은 이렇습니다.
SELECT * FROM <table_name>
WHERE EXISTS (
SELECT 1
FROM (
VALUES
('I', 'COMM'),
('I', 'CORE')
) AS MyTable(a, b)
WHERE a = value_type AND b = CODE1
);
결론적으로 임시 테이블을 만들고 그에 대한 질의를 하는 것이 최선의 선택이라고 생각합니다.그러나 사용자가 임시 테이블을 만들 수 있는 권한이 없는 경우와 같이 이러한 작업을 수행할 수 없는 경우가 있으며 테이블 값 생성자를 사용하는 것이 최선의 선택일 수 있습니다.데이터베이스 성능이 향상된 항목에 따라 EXIST 또는 JOIN을 사용합니다.
보통은 할 수 없지만 다음과 같은 방법을 사용할 수 있습니다.
SELECT * FROM <table_name>
where (value_type+'/'+CODE1) IN (('I'+'/'+'COMM'),('I'+'/'+'CORE'));
더 나은 해결책은 값을 하드 코딩하지 않고 임시 또는 영구 테이블에 넣는 것입니다.
CREATE TABLE #t (ValueType VARCHAR(16), Code VARCHAR(16))
INSERT INTO #t VALUES ('I','COMM'),('I','CORE')
SELECT DT. *
FROM <table_name> DT
JOIN #t T ON T.ValueType = DT.ValueType AND T.Code = DT.Code
따라서 코드(영구 테이블 버전)에 데이터를 저장하지 않고 코드를 변경하지 않고 필터를 쉽게 수정할 수 있습니다.
내 생각에 너는 이것을 시도해 볼 수 있을 것 같아, 결합.and
그리고.or
동시에
SELECT
*
FROM
<table_name>
WHERE
value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE')
열을 문자열로 '결합'하고 값을 문자열로 결합하여 전달할 수 있습니다.
where (cast(column1 as text) ||','|| cast(column2 as text)) in (?1)
다른 방법은 여러 개의 작업을 하는 것입니다.
MS SQL에서도 비슷한 문제가 있었지만, 조금 다릅니다.아마도 미래의 누군가에게 도움이 될 것입니다. 저의 경우 이 솔루션을 찾았습니다(전체 코드가 아니라 예만 해당).
SELECT Table1.Campaign
,Table1.Coupon
FROM [CRM].[dbo].[Coupons] AS Table1
INNER JOIN [CRM].[dbo].[Coupons] AS Table2 ON Table1.Campaign = Table2.Campaign AND Table1.Coupon = Table2.Coupon
WHERE Table1.Coupon IN ('0000000001', '0000000002') AND Table2.Campaign IN ('XXX000000001', 'XYX000000001')
물론 표에 있는 쿠폰과 캠페인에는 빠른 검색을 위한 색인이 있습니다.
MS SQL에서 계산
SELECT * FROM <table_name>
where value_type + '|' + CODE1 IN ('I|COMM', 'I|CORE');
언급URL : https://stackoverflow.com/questions/35194028/in-clause-in-sql-server-with-multiple-columns
'bestsource' 카테고리의 다른 글
파이테스트를 사용하여 오류가 발생하지 않았는지 확인하는 방법 (0) | 2023.06.13 |
---|---|
UIBarButtonItem 글꼴 변경 (0) | 2023.06.13 |
Conda: github에서 직접 설치/업그레이드 (0) | 2023.06.13 |
JavaScript 'new Date()'는 어떤 시간대를 사용합니까? (0) | 2023.06.13 |
셀 형식이 너무 많음 (0) | 2023.06.08 |