bestsource

여러 열이 있는 SQL Server의 'In' 절

bestsource 2023. 6. 13. 22:27
반응형

여러 열이 있는 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

반응형