【问题标题】:create sql function ( Column typeX)创建 sql 函数(列类型 X)
【发布时间】:2017-11-10 09:51:45
【问题描述】:

创建sql函数(列类型X)

嗨 我有这张桌子:

  autoID   |    id   |    name   |    age    |   Tel
------------------------------------------
      1    |    1   |   Frank   |    40     |   null
      2    |    1   |   null    |    50     |   7834xx
      3    |    1   |   Alex    |    null   |   null
      4    |    1   |   null    |    20     |   null
      5    |    2   |   James   |    null   |   4100xx
      6    |    3   |   jan     |    24     |   null
      7    |    3   |   null    |    null   |   4100xx

我对 select 的查询:

SELECT TOP 10
(SELECT top(1) name FROM test1 where id=1 and name is not null order by autoID desc) as name ,(SELECT top(1) age FROM test1 where id=1 and age is not null order by autoID desc) as Age ,(SELECT top(1) Tel 
FROM test1 
where id=1 and Tel 

autoID desc 不是 null 顺序)作为 Telephon FROM [dbo].[test1] group by id

结果:

  autoID   |    id   |   name    |    age    |   Tel
------------------------------------------
      1    |    1    |   Alex    |    20     |  7834xx

我需要这样的创建函数:

CREATE FUNCTION TestSchema.MyfunctinX(@ColumnX @ColumnX.type)
RETURNS @ColumnX.type
AS
BEGIN
    DECLARE @value @ColumnX.type
    SELECT  top 1 @value from @ColumnX where @value is not null order by @autoID desc
    RETURN @value
END;
GO

对于我的选择查询,得到 Short like:

Select Id, MyfunctinX(name) as [Name], MyfunctinX(age) as Age, MyfunctinX(Tel)
as Tel from yourtable Group by Id

有没有办法做到这一点?

【问题讨论】:

    标签: sql function tsql stored-procedures


    【解决方案1】:

    您的结构效率不高。使用 EAV 结构(实体属性值)可能会更好地为您服务

    示例

    Select A.ID
          ,Name = [dbo].[MyFunction] (A.ID,'Name')
          ,Age  = [dbo].[MyFunction] (A.ID,'Age')
          ,Tel  = [dbo].[MyFunction] (A.ID,'Tel')
     From  (Select Distinct ID From YourTable ) A
    

    退货

    ID  Name    Age     Tel
    1   Alex    20      7834xx
    2   James   NULL    4100xx
    3   jan     24      4100xx
    

    UDF

    CREATE FUNCTION [dbo].[MyFunction] (@ID int,@Field varchar(100))
    Returns varchar(max)
    As
    Begin
    Return (  
    
    Select Top 1 with ties Value
     From (Select XMLData = cast((Select * from YourTable where ID=@ID For XML RAW) as xml)) A
     Cross Apply (
                    Select autoID = r.value('@autoID','int')
                          ,Item   = attr.value('local-name(.)','varchar(100)')
                          ,Value  = attr.value('.','varchar(max)') 
                     From  A.XMLData.nodes('/row') as A(r)
                     Cross Apply A.r.nodes('./@*') AS B(attr)
                     Where attr.value('local-name(.)','varchar(100)') not in ('autoID')
                       and attr.value('local-name(.)','varchar(100)')= @Field
                 ) B
      Order By Row_Number() over (Partition By Item Order By autoID Desc)
    )
    End
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多