2017-12-22 20 views
1

고유 한 호스트 이름 목록에서 다양한 고유 한 문자열을 찾기 위해 맵 테이블을 만들었습니다.SQL Server : 조인을 포함하는 where 절에 LEN 또는 변수 사용

다양한 길이 (예 : varchar(2), varchar(11) 등)를 입력하면 초기 코드가 작동합니다. 가변 길이는 내 문제가 발생한 부분을 참조하려고합니다.

변수를 사용하기 전에 여러 가지 조합을 시도했습니다. 나는 또한 어려움 변수를 사용하는 데 오전 m.[HostNameAlias_IDLength]

varchar(2) 대체 where 절에서 예를 들어

.

의견을 보내 주시면 감사하겠습니다.

TM

P. 코드 및 샘플 테이블 목록은 아래에 나열되어 있습니다.

  • HostNameAlias_id (PK VARCHAR (5), 널되지 않음)
  • ProjectName_ID (INT 아니라 NULL)
  • HostnameAlias_IDLength (계산, INT, NULL)

데이터

HostNameAlias_ID ProjectName_ID HostNameAlias_IDLength 
---------------------------------------------------------- 
H123456789023456   16009 16 
B123456789023    16005 13 
C1234567890     16009 11 
d12345678     16009 9 
e123456      16009 8 
f12345      16003 6 
g1234      16035 5 
h123      16035 4 
j12       16005 3 
k1       16007 2 
,210

표 2

  • [host name (PK, NVARCHAR (50), 널되지
  • Projectname_id (INT), 널되지

샘플 데이터 :

Host name   Title   projectname_ID 
-------------------------------------------------- 
C1234567890a1  vp     16009 
C1234567890a2  avp     16009 
h12335    student    16009 
h12356    teacher    16009 
h12357    prof    16009 

쿼리

DECLARE @len = INT() 
DECLARE @slen = VARCHAR(2); 

SELECT DISTINCT 
    @len = m.[HostNameAlias_IDLength], 
    @slen = CONVERT(varchar(2), m.[HostNameAlias_ID]), 
    c.[Host Name], 
    m.[projectname_id] 
FROM 
    [table1] c 
JOIN 
    [table2] m ON c.[projectname_id] = m.[projectname_id] 
WHERE 
    CONVERT(varchar(2), [Host Name]) IN (SELECT [HostNameAlias_ID] 
             FROM [table2]) 
+1

왜 varchar의 길이가 걱정 되십니까? 그것은 가변 길이입니다 ...이 복잡한 점을 보지 못합니다. 만약 당신이 계속 varchar 변환에 길이를 대체하는 동적 SQL이 필요합니다 생각합니다. –

+0

문제를 해결했거나 솔루션을 찾는 데 가장 도움이 되었기 때문에 답변을 수락하려면 [* * 틱 *] (https://ibb.co/ikqyO6)을 클릭하십시오. (nb : 클릭하여 실행 취소). ** 답변 수락 **은 답을 찾거나 해결할 질문을 찾을 때 ** 답은 문제가 해결되었음을 나타내고 ** 다른 사용자는 시간을 절약 할 수 있음을 나타냅니다. * 추신 : 당신이 대답을 수락하면 2 평판 포인트를 얻을 것이다 * –

답변

1

결과의 길이는 그 길이를 발견하는 데 사용 된 where 절에서 알 수 없으므로, 왜 이것을 시도하는지 알지 못합니다. 또한 [호스트 이름] 열은 varchar (16)이므로 최대 16 자까지 사용할 수 있으므로 변환이 필요한 경우 최대 값을 사용하십시오.

이하 나는 IN 대신 LIKE를 사용 했으므로 아마도 도움이 될 것입니다.

SQL Fiddle

MS SQL 서버 2014 스키마 설정 : 1

CREATE TABLE Table1 
    ([HostNameAlias_ID] varchar(16), [ProjectName_ID] int, [HostNameAlias_IDLength] int) 
; 

INSERT INTO Table1 
    ([HostNameAlias_ID], [ProjectName_ID], [HostNameAlias_IDLength]) 
VALUES 
    ('H123456789023456', 16009, 16), 
    ('B123456789023', 16005, 13), 
    ('C1234567890', 16009, 11), 
    ('d12345678', 16009, 9), 
    ('e123456', 16009, 8), 
    ('f12345', 16003, 6), 
    ('g1234', 16035, 5), 
    ('h123', 16035, 4), 
    ('j12', 16005, 3), 
    ('k1', 16007, 2) 
; 


CREATE TABLE Table2 
    ([HostName] varchar(13), [Title] varchar(7), [projectname_ID] int) 
; 

INSERT INTO Table2 
    ([HostName], [Title], [projectname_ID]) 
VALUES 
    ('C1234567890a1', 'vp', 16009), 
    ('C1234567890a2', 'avp', 16009), 
    ('h12335', 'student', 16009), 
    ('h12356', 'teacher', 16009), 
    ('h12357', 'prof', 16009) 
; 

검색어 :

SELECT 
     m.[HostName] 
    , c.[HostNameAlias_ID] 
    , m.[projectname_id] 
    , c.[HostNameAlias_IDLength] 
FROM [table1] c 
JOIN [table2] m ON c.[projectname_id] = m.[projectname_id] 
WHERE [HostName] LIKE ([HostNameAlias_ID] + '%') 

Results :

|  HostName | HostNameAlias_ID | projectname_id | HostNameAlias_IDLength | 
|---------------|------------------|----------------|------------------------| 
| C1234567890a1 |  C1234567890 |   16009 |      11 | 
| C1234567890a2 |  C1234567890 |   16009 |      11 | 

재 : 열 이름에 공백이 포함 [Host name]은 피해야한다 수있는 합병증, 그래서 내가 대신 [HostName]을 사용했다.

+0

고마워, 완벽하게 작동합니다. – TMilzSr

+0

좋은 소식입니다. 대답 수락에 대해 알고 있습니까? [help/accepting] (https://stackoverflow.com/help/someone-answers)을 더 보려면 [** 클릭 **] (https://ibb.co/ikqyO6) –