0

У меня есть таблица со многими столбцами. Все столбцы (атрибуты) называются с использованием одного и того же соглашения об именах: thisIsColumnName, thisIsAttributeName, thisIsAlsoColumnName и т. Д. Я хотел бы создать запрос (возможно, используя таблицу information_schema.columns), которая разбивает все эти имена на части и создает один список, содержащий отдельные части всех имен столбцов:SQL Query: как разбить имя столбца на куски (regexp?)

thisIsColumnName 
thisIsAttributeName 

производит

this 
Is 
Column 
Attribute 
Name 

Как я могу сделать это для всех моих столбцов в таблице (и, возможно, все таблицы в базе данных), используя T-SQL? Есть идеи?

+1

ищет функцию раскола, есть много для SQL Server, а затем сделать его разделить на заглавной буквы, а не обычный «». см. http://stackoverflow.com/questions/4098216/how-to-join-to-a-table-that-has-multiple-values-in-the-column/4098376#4098376 –

ответ

0

Как @ Крис Lively указывает на твердую функцию верблюд расщепления Вероятно, какая-то форма - лучший подход, но вот один запрос, который делает все это встроенным. Очевидно, что для сопоставления шаблонов, очевидно, рассматривается сравнение, и в этом случае я использовал чувствительную к регистру функцию PATINDEX (поскольку в стороне я должен был явно определить каждую прописную букву в соответствующем выражении, поскольку [AZ] не вернул правильную результаты, я думаю, что это тема для 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 
1

Один из способов - написать пользовательскую функцию CLR, которая сделала это для вас. Вот пример, где я взять что-то вроде «ThisIsAColumnName» и испускают «This Is Столбец Имя»

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

Смежные вопросы