【问题标题】:SQL Query: how to break column name into pieces (regexp?)SQL 查询:如何将列名分成几部分(正则表达式?)
【发布时间】:2010-11-17 19:51:30
【问题描述】:

我有一张有很多列的表。所有列(属性)都使用相同的命名约定命名:thisIsColumnName、thisIsAttributeName、thisIsAlsoColumnName 等。我想创建一个查询(可能使用 information_schema.columns 表),它将所有这些名称分成几部分并生成一个包含所有列名的不同部分:

thisIsColumnName
thisIsAttributeName

生产

this
Is
Column
Attribute
Name

如何使用 T-SQL 对表中的所有列(也可能是数据库中的所有表)执行此操作?有什么想法吗?

【问题讨论】:

标签: sql sql-server sql-server-2005 sql-server-2008 stored-procedures


【解决方案1】:

一种方法是编写一个 CLR 用户定义函数来为您完成它。这是一个示例,我采用“ThisIsAColumnName”之类的内容并发出“This Is A Column Name”

public static String SplitCamel( String input ) {
    return System.Text.RegularExpressions.Regex.Replace(input, "([A-Z][A-Z]*)", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim();
} // method::SplitCamel

有关详细信息,请参阅此内容: http://msdn.microsoft.com/en-us/library/w2kae45k(VS.80).aspx

【讨论】:

    【解决方案2】:

    正如@Chris Lively 所指出的,某种形式的可靠骆驼分割函数可能是最好的方法,但这里有一个查询可以内联。排序规则显然是模式匹配的一个考虑因素,在这种情况下,我在 PATINDEX 函数中使用了区分大小写的一个(顺便说一句,我必须在匹配表达式中明确定义每个大写字母,因为 [A-Z] 没有返回正确的结果,我认为这是another question....的主题)

    CREATE TABLE dbo.OriginalNames 
    (
        CamelCaseName        VARCHAR(30),    
    )
    GO
    
    INSERT INTO dbo.OriginalNames VALUES ('thisIsColumnName')
    INSERT INTO dbo.OriginalNames VALUES ('thisIsAttributeName')
    INSERT INTO dbo.OriginalNames VALUES ('thisIsAnotherAttributeName')
    
    GO
    
    SELECT * FROM dbo.OriginalNames;
    GO
    
    WITH
    L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
    L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
    L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
    L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
    Numbers AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L3)
    SELECT DISTINCT(SplitNames.Value)
    FROM (
    SELECT  nums.n, names.CamelCaseName, LTRIM(RTRIM(SUBSTRING(names.CamelCaseName, nums.n - 1, PATINDEX('%[|ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', SUBSTRING(names.CamelCaseName + N'|', nums.n, LEN(names.CamelCaseName)) COLLATE SQL_Latin1_General_Cp1_CS_AS)))) AS [Value]
     FROM   Numbers AS nums INNER JOIN dbo.OriginalNames AS names ON nums.n <= CONVERT(int, LEN(names.CamelCaseName) + 1) AND PATINDEX('%[|ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', SUBSTRING(N'|' + names.CamelCaseName, nums.n, 1) COLLATE SQL_Latin1_General_Cp1_CS_AS) > 0) AS SplitNames
    
    GO
    
    --DROP TABLE dbo.OriginalNames
    
    -- OUTPUT as follows
    --
    -- Value
    -- =========
    -- Another
    -- Attribute
    -- Column
    -- Is
    -- Name
    -- this 
    

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2022-01-20
      • 1970-01-01
      • 2013-10-19
      • 2016-04-21
      相关资源
      最近更新 更多