SQL查询:将多个字符串类型的列连接成一个

4

假设我的表包含以下列

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

我需要使用SQL查询在这些subject1到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"


抱歉,我有点困惑;你是有一个名为roll_number的列还是有多个名为subject1subject2的列? - BellevueBob
哦,没事,对我来说还很早...... - BellevueBob
4个回答

5
您可以这样使用IN谓词:
SELECT * 
FROM students_data 
WHERE 'BIOLOGY' IN (subject1, subject2, . . . , subject8);

@mahmoud Gamal。这非常有用。谢谢。但实际上我不需要匹配整个字段。我实际上需要在上面给出的例子中匹配子字符串,比如说"BIO"。但是subject1、subject2....subject8这些字段可能包含"BIOLOGY"。 - adeel iqbal

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%';


它不能工作,因为任何一个主题字段都可能包含NULL值。有没有其他的替代方案? - adeel iqbal
没有用,因为一些字段的值为NULL,无法解决我的问题。 - adeel iqbal
@adeeliqbal:已更新答案。请告诉我您是否仍然面临任何问题。 - Fahim Parkar
它让查询有点复杂。我在寻找一些简单的方式,如果可能的话。 - adeel iqbal
@adeeliqbal:只是确认一下,您正在使用 MS SQL Server... 对吗? - Fahim Parkar
如果你的数据库是MySQL,CONCAT_WS会让它更容易。 - Fahim Parkar

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')

注意:请注意使用CONTAINS,无论如何都应该更快。

我没有测试上述查询,它们可能有错别字。


0
在这种情况下,怎么样?
SELECT * 
FROM students_data
WHERE 
nvl(subject1,'') + ' ' + nvl(subject2,'') + ' ' + ..... + nvl(subject8,'') 
LIKE '%BIO%';

如果您的数据库不支持,可以使用ifnull()decode()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接