也许我正朝着错误的方向前进,所以我喜欢关于如何以不同的方式处理这个问题的一些指示。
我有多个MySql数据库表,每个表有50个以上的TEXT字段(类别)(原因,问题,原因,处置......等等),其中一些(大多数)是空的,有些不是,取决于关于他们描述的项目。
我想将这些内容转换为',' text'而是表。例如
item, reason , problem , cause , disposition
0001, null , broken widget, unknown , null
0002, returned, null , customer unhappy, in transit
到
item, topic , text
0001, problem , broken widget
0001, cause , unknown
0002, reason , returned
0002, cause , customer unhappy
0002, disposition, in transit
所以,我正在摆弄一个精选查询,这是我到目前为止所得到的:
SELECT item, problem AS 'text', 'problem' AS 'topic' FROM my_table
WHERE problem IS NOT NULL;
我将如何添加下一个类别?像
SELECT item, cause AS 'text', 'cause' AS 'topic' FROM my_table
WHERE cause IS NOT NULL;
1:我如何将其添加到上一个select语句中,以便它涵盖'原因'和'问题'?
2:既然有这么多类别,有没有办法避免手工劳动,并以某种方式迭代字段名称?
答案 0 :(得分:1)
您可以使用UNION ALL
:
SELECT item, problem AS text, 'problem' AS topic
FROM my_table
WHERE problem IS NOT NULL
UNION ALL
SELECT item, cause AS text, 'cause' AS topic
FROM my_table
WHERE cause IS NOT NULL;
为了节省构建查询的时间,您可以使用INFORMATION_SCHEMA
列出列:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename'
AND `TABLE_NAME`='my_table';
将查询与COLUMN_NAME
连接起来,或者只是将列名列表粘贴到Excel中,然后在那里构建查询并复制/删除。
答案 1 :(得分:1)
您需要非常小心在查询中使用单引号。一个简单的规则:仅对字符串和日期常量使用单引号。否则,转义字符是反引号 - 如果您正确命名列和表,则不需要它。
所以这个查询:
SELECT item, cause AS 'text', 'cause' AS 'topic'
FROM my_table
WHERE cause IS NOT NULL;
应该是:
SELECT item, cause AS text, 'cause' AS topic
FROM my_table
WHERE cause IS NOT NULL;
然后,您可以使用union all
:
SELECT item, problem AS text, 'problem' AS topic FROM my_table WHERE problem IS NOT NULL UNION ALL
SELECT item, cause AS text, 'cause' AS topic FROM my_table WHERE cause IS NOT NULL
并且,您可以继续为要包含的所有列添加子查询。
编辑:
如果您想使用information_schema.columns
执行此操作,可以使用replace
:
select replace('SELECT item, <colname> AS text, ''<colname>'' AS topic FROM my_table WHERE problem IS NOT NULL UNION ALL',
'<colname>', column_name)
from information_schema.columns c
where table_name = XXX and
column_name <> 'item';