2014-12-04 17 views
0

我有一个像这样的mysql的字符串 - “my_report_id”。我想删除所有的“_”,并在每个字的首字母都写出所有的首字母。最终的结果应该是 - “MyReportId”。是否有可能在不使用函数/特效的情况下在mysql中实现?我不想使用函数/特效,因为几个原因:如何在不使用mysql函数的情况下在每个单词中创建第一个字母大写?

  1. 我没有创建它们的权限;
  2. 我正在构建的查询应该用在很多数据库中,我不想在每个要运行查询的数据库中创建相同的函数;

我已经看到了很多解决方案,我的问题在互联网上的几个地方使用相同的功能,但正如我已经写了,我不需要功能。

我的任务: 基本上,我想才达到的解析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#命名约定。

也许它不是很漂亮,但是我拥有的时间是我可以找到的最佳解决方案。任何帮助将不胜感激。

+0

为什么你不能使用函数? http://joezack.com/2008/10/20/mysql-capitalize-function/ – faby 2014-12-04 14:32:29

+0

谢谢你的回答。我已经看到了这个功能,但我必须以不同的方式来完成。看到我的问题,我写了一些我不想使用funcs的原因。 – 2014-12-04 14:46:31

+0

可悲的是,你真的**不能**做到这一点。一个可怜的人C#标识符的标题案例可以用正则表达式来完成,但不幸的是,MySQL中的REGEXP支持匹配但不能替换...所以即使对于这个,你也需要一个函数(在这种情况下,你最好写一个MAKE_VALID_IDENTIFIER()UDF 。好吧... AFAIK你不能(在MySQL中),但没有理由你**没有后处理生成的C#源文件**编译之前... – 2014-12-04 14:52:06

回答

0

这是一个非常,非常丑陋的解决方案,但它的工作相当不错,而无需使用的功能:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(COLUMN_NAME, '_a', 'A'), '_b', 'B'), '_c', 'C'), '_d', 'D'), '_e', 'E'), '_f', 'F'), '_g', 'G'), '_h', 'H'), '_i', 'I'), '_j', 'J'), '_k', 'K'), '_l', 'L'), '_m', 'M'), '_n', 'N'), '_o', 'O'), '_p', 'P'), '_q', 'Q'), '_r', 'R'), '_s', 'S'), '_t', 'T'), '_u', 'U'), '_v', 'V'), '_w', 'W'), '_x', 'X'), '_y', 'Y'), '_z', 'Z') 

解析信件这种方式,使得有可能遵循C#标准的命名约定。

相关问题