【发布时间】:2015-02-02 11:22:45
【问题描述】:
我在 mysql 中有一个这样的字符串 - “my_report_id”。我想删除所有“_”并将每个单词中的所有首字母大写。最终结果应该是 - “MyReportId”。是否可以在不使用函数/过程的情况下在 mysql 中实现这一点?我不想使用函数/procs,有几个原因:
- 我没有创建它们的权限;
- 我正在构建的查询应该在很多数据库中使用,我不想在要运行查询的每个数据库中创建相同的函数;
我已经在互联网上的几个地方看到了很多解决我的问题的方法,但正如我已经写的那样,我不需要函数。
我的任务: 基本上我想要实现的是将 mysql 表解析为 ASP.NET MVC 的 C# 模型类。我需要在 mysql 中创建这个“解析器”,我发现这个解决方案(提供代码的第二个答案)非常有用 - Create C# classes based of MySQL table 我从链接中的代码开始,并将其更新为解析可空和无符号类型。我做了这样的事情:
SELECT CONCAT('[Table(Name = "myTableName")]') UNION
SELECT CONCAT('public class ', "myTableName",'{') UNION
SELECT CONCAT('[Column(Name = "', COLUMN_NAME, '")] \n public ',
CASE IS_NULLABLE
WHEN 'NO' THEN
CASE WHEN COLUMN_TYPE LIKE '%unsigned%' THEN myTypeNonNullableUnsigned.cSharpType
ELSE myTypeNonNullable.cSharpType
END
WHEN 'YES' THEN
CASE WHEN COLUMN_TYPE LIKE '%unsigned%' THEN myTypeNullableUnsigned.cSharpType
ELSE myTypeNullable.cSharpType
END
END, ' ',
CONCAT(UCASE(LEFT(COLUMN_NAME, 1)), SUBSTRING(COLUMN_NAME, 2)),
' {get;set;}')
FROM INFORMATION_SCHEMA.COLUMNS c
JOIN(
SELECT 'char' AS sqlType ,'string' AS cSharpType UNION ALL
SELECT 'varchar', 'string' UNION ALL
SELECT 'datetime', 'DateTime' UNION ALL
SELECT 'text', 'string' UNION ALL
SELECT 'tinyint', 'bool' UNION ALL
SELECT 'int', 'int' UNION ALL
SELECT 'longtext', 'string'
) myTypeNonNullable ON c.DATA_TYPE LIKE myTypeNonNullable.sqlType
JOIN(
SELECT 'char' AS sqlType ,'string' AS cSharpType UNION ALL
SELECT 'varchar', 'string' UNION ALL
SELECT 'datetime', 'DateTime?' UNION ALL
SELECT 'text', 'string' UNION ALL
SELECT 'tinyint', 'bool?' UNION ALL
SELECT 'int', 'int?' UNION ALL
SELECT 'longtext', 'string'
) myTypeNullable ON c.DATA_TYPE LIKE myTypeNullable.sqlType
JOIN(
SELECT 'char' AS sqlType ,'string' AS cSharpType UNION ALL
SELECT 'varchar', 'string' UNION ALL
SELECT 'datetime', 'DateTime' UNION ALL
SELECT 'text', 'string' UNION ALL
SELECT 'tinyint', 'bool' UNION ALL
SELECT 'int', 'uint' UNION ALL
SELECT 'longtext', 'string'
) myTypeNonNullableUnsigned ON c.DATA_TYPE LIKE myTypeNonNullableUnsigned.sqlType
JOIN(
SELECT 'char' AS sqlType ,'string' AS cSharpType UNION ALL
SELECT 'varchar', 'string' UNION ALL
SELECT 'datetime', 'DateTime' UNION ALL
SELECT 'text', 'string' UNION ALL
SELECT 'tinyint', 'bool' UNION ALL
SELECT 'int', 'uint?' UNION ALL
SELECT 'longtext', 'string'
) myTypeNullableUnsigned ON c.DATA_TYPE LIKE myTypeNullableUnsigned.sqlType
WHERE TABLE_SCHEMA='myTableSchema' AND TABLE_NAME='myTableName'
UNION
SELECT '}';
唯一剩下的就是使属性的名称符合 c# 命名约定。
也许它不是很漂亮,但就目前而言,这是我能想到的最佳解决方案。任何帮助将不胜感激。
【问题讨论】:
-
为什么不能使用函数?这里有一个完美的joezack.com/2008/10/20/mysql-capitalize-function
-
感谢您的回答。我已经看到了这个功能,但我必须以不同的方式来做。看到我的问题,我在那里写了一些我不想使用funcs的原因。
-
很遗憾你真的不能做到这一点。 C# 标识符的一个穷人标题案例可以用正则表达式完成,但不幸的是 MySQL 中的 REGEXP 支持匹配但不替换......所以即使这样你也需要一个函数(在这种情况下你最好写一个 MAKE_VALID_IDENTIFIER() UDF . 嗯...AFAIK 你不能(在 MySQL 中)但是没有理由在编译之前不对生成的 C# 源文件进行后处理...
-
Adriano Rapetti,如果我以某种方式匹配每个“_”之后的字母,我将轻松地将其替换为 mysql 标准函数 REPLACE()。之后,我已经有了使第一个字母大写的解决方案。还是我错了?
标签: c# mysql asp.net-mvc