0

我有一个包含 99 列和 rowid 的表:

[RowID] [int] NOT NULL,
[Col1] [nvarchar](max) NULL,
[Col2] [nvarchar](max) NULL,
[Col3] [nvarchar](max) NULL,
[Col4] [nvarchar](max) NULL,
.......
[Col99] [nvarchar](max) NULL

桌子

我需要一个可在 Micrsoft SQL Server 视图中使用的函数(必须是视图且视图中没有变量)来搜索唯一字符串,然后在视图中显示为新字段。我目前的方法是使用 case 语句搜索每一列,直到找到唯一的字符串。这种方法写起来很麻烦(效率低下),我有几个唯一的字符串要搜索。

    SELECT     RowID, COALESCE (
    CASE WHEN Col1 LIKE '%UniqueString%' THEN Col1 ELSE NULL END, 
    CASE WHEN Col2 LIKE '%UniqueString%' THEN Col2 ELSE NULL END, 
    CASE WHEN Col3 LIKE '%UniqueString%' THEN Col3 ELSE NULL END, 
    CASE WHEN Col4 LIKE '%UniqueString%' THEN Col4 ELSE NULL END, 
    CASE WHEN Col5 LIKE '%UniqueString%' THEN Col5 ELSE NULL END, 
    CASE WHEN Col6 LIKE '%UniqueString%' THEN Col6 ELSE NULL END,  
    ………..
    CASE WHEN Col99 LIKE '%UniqueString%' THEN Col99 ELSE NULL END) AS [UniequeString] 
    FROM         dbo.TABLE_A

最终视图应具有以下结果:

在此处输入图像描述

4

2 回答 2

2

在您的示例'UNIQUESTRING'中是列的值。如果是这种情况,那么使用like就大材小用了。你可以做:

select (case when 'UNIQUESTRING' in (col1, col2, . . ., col99) then 'UNIQUESTRING'
        end)

另一种可能。看起来UNIQUESTRING在每列的第一个非 NULL 值中。如果是这样,您可以这样做:

select (case when coalesce(col1, col2, . . . col99) like '%UNIQUESTRING%'
             then coalesce(col1, col2, . . . col99)
        end)
于 2013-08-08T19:56:13.707 回答
1

如果您有超过 10 列,则不想明确指定它。相反,使用Columns to Rows XML 技巧

;with cte1 as (
  select t.RowID, (select t.* for xml raw('row'), type) as Data
  from Temp1 as t
), cte2 as (
    select
         C.RowID,
         F.C.value('local-name(.)', 'nvarchar(128)') as Name,
         F.C.value('.', 'nvarchar(max)') as Value
    from cte1 as c
        outer apply c.Data.nodes('row/@*') as F(C)
)
select
    RowID,
    max(
        case
            when Name = 'RowID' then null
            when Value like '%uniquestring%' then Value
        end
    ) as Value
from cte2
group by RowID

sql小提琴示例

于 2013-08-08T20:01:25.320 回答