4

テーブルに次の列が含まれていると仮定します

 Roll_number numeric           not null
 Subject1    varchar(40)       null
 Subject2    varchar(40)       null
 . . .
 Subject8    varchar(40)       null

SQLクエリを使用して、これらすべての件名1から8で件名を検索する必要があります。これらの列のいずれかが NULL 値を持つ可能性があることを念頭に置いて、これらすべての列で部分文字列を検索するのに最適なクエリは何でしょうか。

私が書いた

select * 
from students_data 
where subject1="BIOLOGY" or subject2="BIOLOGY" . . . . or subject8="BIOLOGY" 

しかし、実際にはテーブルに20を超える列があるため、簡単なクエリが必要です

クエリ

select * from table1 where "BIOLOGY" in (subject1,subject2,subject3)

役に立ちましたが、そのテーブルフィールドの
「BIO」のような部分文字列(その件名の一部)だけを一致させる必要がある場合はどうなりますか

4

4 に答える 4

5

IN次のように述語を使用できます。

SELECT * 
FROM students_data 
WHERE 'BIOLOGY' IN (subject1, subject2, . . . , subject8);
于 2012-12-26T15:13:05.310 に答える
1

これはどう?

SELECT * 
FROM students_data
WHERE subject1 + ' ' + subject2 + ' ' + ..... + subject8 LIKE '%BIOLOGY%';

アップデート1

NULL値の場合は、以下を使用してください。

SELECT * 
FROM students_data
WHERE ISNULL(subject1,'') + ' ' + ISNULL(subject2,'')
+ ' ' + ..... + ISNULL(subject8,'') LIKE '%BIOLOGY%';

BIOを使用する場合は、LIKE '%BIO%';

于 2012-12-26T15:17:48.840 に答える
1

これは速くはないかもしれませんが、より明確になったと思います。

最初に正規化されたビューを作成します (この方法でデータを保存することができます - これは理想的です)

Create View SubjectData AS
(
   SELECT Roll_number, 1 AS SubjectNumber, Subject1 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 2 AS SubjectNumber, Subject2 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 3 AS SubjectNumber, Subject3 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 4 AS SubjectNumber, Subject4 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 5 AS SubjectNumber, Subject5 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 6 AS SubjectNumber, Subject6 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 7 AS SubjectNumber, Subject7 AS Subject FROM TABLE1
   UNION ALL
   SELECT Roll_number, 8 AS SubjectNumber, Subject8 AS Subject FROM TABLE1
)

選択は簡単です:

SELECT Roll_number, SubjectNumber from SubjectData where CONTAINS(Subject,'Bio')

NB CONTAINSの使用に注意してください。これは、どのように実行しても高速になるはずです。

上記のクエリはテストしていません。タイプミスがある可能性があります。

于 2012-12-26T16:44:59.693 に答える
0

そんな時はこれでどうだ、

SELECT * 
FROM students_data
WHERE 
nvl(subject1,'') + ' ' + nvl(subject2,'') + ' ' + ..... + nvl(subject8,'') 
LIKE '%BIO%';

データベースがサポートしていない場合は、ifnull()またはを選択してくださいdecode()

于 2012-12-26T15:26:20.780 に答える