2017-11-27 15 views
1

謝罪これまでに聞いたことがある場合、私は多くの質問をしましたが、この問題に適用できる回答を見つけることができませんでした。キャスト可能なデータとキャスト不可能なデータが混在する列に2つのテーブルを結合することはできますか?

データベースからSSRSレポートを作成しています。私は読み取り専用アクセス権を持っていますが、希望の形式でデータを選択することができません。私が見たい何

Table 1: Referenced Data 
==== ============= 
ID Description 
==== ============= 
1 Apple   
2 Orange  
3 Pear   
==== ============= 

Table 2: Records 
==== ====== ======== 
ID Data Tag 
==== ====== ======== 
1 1  List  
2 2  List  
3 Red String 
4 Blue String 
5 3  List  
==== ====== ======== 

は次のとおりです。

Report 
========== ========= 
RecordNo Content 
========== ========= 
    1  Apple  
    2  Orange 
    3  Red  
    4  Blue  
    5  Pear  
========== ========= 

問題はT1のID列がBIGINTである一方、T2のデータ列がNVARCHARです。 Listタグで行のみを選択して変換エラーを回避することはできますが、文字列データは失われます。

私はselect文で何をしようとしているのですか?これはいくつかの創造性をもって行うことができるものだと感じていますが、私はまだ学習過程にあり、私のSQLはそれほどまだありません。

+0

どのdbms ???????? – Eric

+0

こんにちはエリック、それはSQL Serverだったことを謝罪します。 – Jared

答えて

0
SELECT 
    rec.Id 
    ,Content = CASE WHEN data.Id IS NOT NULL THEN data.Description ELSE rec.Data END 
FROM 
    Records rec 
    LEFT JOIN ReferencedData data 
    ON rec.Tag <> 'String' 
    AND rec.Data = CAST(data.Id AS NVARCHAR(50)) 

あなたは暗黙の型変換エラーを回避しますあなたの結合条件の一部としてNVARCHARBIGINTをキャストすることができます。

+0

すごく、ありがとう、マット。これはトリックでした。私はbigintの変換エラーに文字列の上に私の頭脳をぶらつくので忙しかった私はbigintを代わりに鋳造すると考えなかった。そして、これを手助けする時間がかかった皆様に感謝します。 – Jared

0

あなたはこのような何かを試みることができる:

;WITH DataNum AS 
(
SELECT ID, Data FROM Records WHERE ISNUMERIC(Data) = 1 
) 
SELECT dn.ID, rd.Description 
FROM DataNum dn 
JOIN ReferencedData rd ON dn.Data = rd.ID 
UNION ALL 
SELECT ID, Data 
FROM Records 
WHERE ISNUMERIC(Data) <> 1 
0
select table2.id 
    , coalesce(table1.description, table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = table2.data 
order by table2.id 

これは、MySQL(SQL Fiddle)で動作しますが、SQL Serverの(SQL Fiddle)およびOracle(SQL Fiddle)のわずかな変化が必要です。

select table2.id 
    , coalesce(table1.description,table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = case when table2.tag <> 'String' then table2.data end 
order by table2.id 

をとPostgreSQL(SQL Fiddle)はさらにtweekが必要です。

select table2.id 
    , coalesce(table1.description,table2.Data) as content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and cast(table1.id as varchar(6)) = table2.data 
order by table2.id 
関連する問題