我有一个像这样的mysql的字符串 - “my_report_id”。我想删除所有的“_”,并在每个字的首字母都写出所有的首字母。最终的结果应该是 - “MyReportId”。是否有可能在不使用函数/特效的情况下在mysql中实现?我不想使用函数/特效,因为几个原因:如何在不使用mysql函数的情况下在每个单词中创建第一个字母大写?
- 我没有创建它们的权限;
- 我正在构建的查询应该用在很多数据库中,我不想在每个要运行查询的数据库中创建相同的函数;
我已经看到了很多解决方案,我的问题在互联网上的几个地方使用相同的功能,但正如我已经写了,我不需要功能。
我的任务: 基本上,我想才达到的解析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#命名约定。
也许它不是很漂亮,但是我拥有的时间是我可以找到的最佳解决方案。任何帮助将不胜感激。
为什么你不能使用函数? http://joezack.com/2008/10/20/mysql-capitalize-function/ – faby 2014-12-04 14:32:29
谢谢你的回答。我已经看到了这个功能,但我必须以不同的方式来完成。看到我的问题,我写了一些我不想使用funcs的原因。 – 2014-12-04 14:46:31
可悲的是,你真的**不能**做到这一点。一个可怜的人C#标识符的标题案例可以用正则表达式来完成,但不幸的是,MySQL中的REGEXP支持匹配但不能替换...所以即使对于这个,你也需要一个函数(在这种情况下,你最好写一个MAKE_VALID_IDENTIFIER()UDF 。好吧... AFAIK你不能(在MySQL中),但没有理由你**没有后处理生成的C#源文件**编译之前... – 2014-12-04 14:52:06