SQLite:尝试以比 UNION 字符串更优雅的方式连接列

Posted

技术标签:

【中文标题】SQLite:尝试以比 UNION 字符串更优雅的方式连接列【英文标题】:SQLite: Trying to concatenate columns in more elegant way than string of UNIONs 【发布时间】:2014-08-13 21:44:09 【问题描述】:

我有一个包含以下字段和示例值的表:

coursecode  BIO 101
a_code      FA
b_code      SP
c_code      SU
d_code
e_code

我正在尝试用逗号分隔的所有具有值的“代码”字段(即“FA、SP、SU”)的列表填充另一个表中的字段(使用 coursecode 作为键)。我用下面的代码成功地完成了这个,但它很混乱,想知道是否有更优雅的方式来完成这个(特别是没有所有 UNION 语句):

SELECT coursecode, group_concat(codes)
FROM (
SELECT 
    coursecode, 
    a_code AS codes
FROM scbsupp
    WHERE coursecode="BIO 317"
UNION
SELECT coursecode,
    b_code AS codes
FROM scbsupp
    WHERE coursecode="BIO 317" 
UNION
SELECT 
    coursecode, 
    c_code AS codes
FROM scbsupp
    WHERE coursecode="BIO 317"
UNION
SELECT coursecode,
    d_code AS codes
FROM scbsupp
    WHERE coursecode="BIO 317"
UNION
SELECT coursecode,
    e_code AS codes 
FROM scbsupp
    WHERE coursecode="BIO 317"
) WHERE codes != "";    

根据我自己的知识,我想知道是否有更好的方法来做到这一点,感谢任何帮助!

【问题讨论】:

【参考方案1】:

你可以这样做:

SELECT coursecode,
      LTRIM(
              CASE WHEN (a_code IS NOT NULL AND a_code <> '') THEN        a_code ELSE '' END ||
              CASE WHEN (b_code is NOT NULL AND b_code <> '') THEN ',' || b_code ELSE '' END ||
              CASE WHEN (c_code IS NOT NULL AND c_code <> '') THEN ',' || c_code ELSE '' END ||
              CASE WHEN (d_code IS NOT NULL AND d_code <> '') THEN ',' || d_code ELSE '' END ||
              CASE WHEN (e_code IS NOT NULL AND e_code <> '') THEN ',' || e_code ELSE '' END, ','
            )   AS code
  FROM scbsupp
    WHERE coursecode="BIO 317"

;

【讨论】:

以上是关于SQLite:尝试以比 UNION 字符串更优雅的方式连接列的主要内容,如果未能解决你的问题,请参考以下文章

Python tkinter - 从 ttk.combobox 中检索 SQLite ID。

需要帮助以比剪裁优惠更复杂的方式通过某些文本显示背景

是否应该在 SQLite 中使用 GROUP BY 在 UNION 上进行 INNER JOIN 花费数小时?

SQLite:n个地方的UNION ORDER BY size连同所有的大写字母?

SQLite:如何优化 UNION 查询

sqlite union all 优化