ahmed_sa Ответов: 1

Как сделать так, чтобы пользовательская функция разделила столбец на два столбца текста и цифр ?


проблема

Как сделать UserDefinedFunction в SQL server 2012 разделенным текстом столбца на два столбца .

первый столбец включает текстовые символы только в качестве единицы измерения и

второй столбец включает числа только в случае целого или десятичного числа и т. д.?

create table #temp
(
columnTextNumbers  nvarchar(50)
)
insert into #temp (columnTextNumbers) 
values
('3.5A'),
('5.50kg'),
('35.70kg'),
('9m')


Мне нужно, чтобы существовать функция Split имя столбца columnTextNumbers на временную таблицу #Temp для

два столбца

первый столбец будет columnTextValues включать только единицы измерения .

второй столбец будет columnNumberValues включать только числа, если они целочисленные или десятичные и т. д..

таким образом ввод будет иметь одно значение текст и цифры

и выходной результат будет состоять из двух столбцов, как показано ниже :

columnNumberValues     columnTextValues
3.5                          A
5.50                         kg
35.70                        kg
9                             m


Что я уже пробовал:

SELECT subsrtunit,LEFT(subsrtnumeric, PATINDEX('%[^0-9.]%', subsrtnumeric+'t') - 1)
FROM (
    SELECT subsrtunit = SUBSTRING(string, posofchar, LEN(string)),
  subsrtnumeric = SUBSTRING(string, posofnumber, LEN(string))
    FROM (
        SELECT string, posofchar = PATINDEX('%[^0-9.]%', string),
      posofnumber = PATINDEX('%[0-9.]%', string)
        FROM #temp
    ) d
) t

MadMyche

И ЧТО ЖЕ ПРОИСХОДИТ?
Что касается криков ... после более чем 250 вопросов вы еще не поняли, что мы собираемся задать это

ahmed_sa

Мне нужно сделать результат выше как функцию SQL, так как это сделать .
то что я пытаюсь дать мне правильный результат только то что мне нужно сделать преобразование кода выше в функцию SQL

1 Ответов

Рейтинг:
9

ahmed_sa

спасибо Вам за помощь и поддержку она решена
и это мое решение :

create FUNCTION myfuncolumnTextNumbers (@str varchar(500)) 
RETURNS TABLE
AS RETURN
(
 
--===== Create number table on-the-fly
 WITH Num1 (n) AS (
SELECT 1 as n
UNION ALL SELECT n+1 as n
FROM Num1 Where n<101),
Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num2)
 
,processTable as (
    select   col1  as textCol,col2 as NumCol   
    from (select @str  as columnTextNumbers) #temp Cross Apply (
            select (select C + ''
            from (select N, substring(columnTextNumbers, N, 1) C from Nums  
            where N<=datalength(columnTextNumbers)) t
            where PATINDEX('%[^0-9.]%',C)> 0
            order by N
            FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
        ) p0 (col1) 
	  Cross Apply (
            select (select C + ''
            from (select N, substring(columnTextNumbers, N, 1) C from Nums  
            where N<=datalength(columnTextNumbers)) t
            where PATINDEX('%[0-9.]%',C)> 0
            order by N
            FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
        ) p1 (col2)   
 ) 


SELECT     textCol, NumCol    FROM processTable

 )

 
 


create table #temp
(
columnTextNumbers  nvarchar(50)
)
insert into #temp (columnTextNumbers) 
values
('3.5A'),
('5.50kg'),
('35.70kg'),
('9m')

 
SELECT  columnTextNumbers,   textCol, NumCol    
 FROM  #temp
 cross apply dbo.myfuncolumnTextNumbers(columnTextNumbers) d



drop table #temp
 /*
 columnTextNumbers	textCol	NumCol
3.5A	A	3.5
5.50kg	kg	5.50
35.70kg	kg	35.70
9m	m	9
 */