如何在MariaDB中单次查询同时返回行数据及对应列名
MariaDB单次查询返回列名与值配对结果的解决方案
方案1:JSON格式输出(无需动态语句,适合列少场景)
MariaDB 10.2及以上版本支持JSON_OBJECT函数,可以直接构造列名与值配对的键值对结构:
SELECT JSON_OBJECT( 'ID', ID, 'foo', foo, 'bar', bar, 'fizz', fizz, 'buzz', buzz ) AS key_value_result FROM foobar WHERE ID = 'abc';
返回结果示例:{"ID": "abc", "foo": 0, "bar": 2, "fizz": 0, "buzz": 3}
方案2:自动拼接所有列的动态SQL方案(200列场景无需手动处理)
如果表列数过多不想手动拼写所有列名,可以通过以下一段动态SQL直接完成查询,无需你单独执行元数据查询后手动拼接列名:
-- 替换为你需要查询的ID值 SET @target_id = 'abc'; -- 自动生成查询语句 SET @query_sql = CONCAT( 'SELECT JSON_OBJECT(', (SELECT GROUP_CONCAT(CONCAT('''', COLUMN_NAME, ''', ', COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'foobar'), ') AS key_value_result FROM foobar WHERE ID = ?' ); -- 执行查询 PREPARE stmt FROM @query_sql; EXECUTE stmt USING @target_id; DEALLOCATE PREPARE stmt;
该方案的元数据查询和最终数据查询合并在同一段执行逻辑中,你只需要执行这段代码即可拿到结果,完全不需要手动处理200个列名的拼接工作。
方案3:自定义元组格式输出
如果你需要的是类似((ID, abc), (foo,0), (bar,2), (fizz,0), (buzz,3))的字符串格式,可以调整拼接逻辑:
SET @target_id = 'abc'; SET @query_sql = CONCAT( 'SELECT CONCAT(''(', (SELECT GROUP_CONCAT(CONCAT('''(', COLUMN_NAME, ', ''', ',', COLUMN_NAME, ', '')''')) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'foobar'), ')'' AS formatted_result FROM foobar WHERE ID = ?' ); PREPARE stmt FROM @query_sql; EXECUTE stmt USING @target_id; DEALLOCATE PREPARE stmt;
内容的提问来源于stack exchange,提问作者ivorysoap
相关产品推荐
相关产品推荐

