patindex()函数问题

时间:2011-03-01 17:08:31

标签: sql sql-server tsql

我创建了以下表格

create table publisher(
  name varchar(20), 
  city varchar(20)
)

我想运行以下要求:

  

从名称列出字符'a'的所有位置。

为此,Ii运行了以下查询:

select patindex('%a%', name)
  from publisher;

但是,它没有显示正确的输出。当我输入'city'列而不是'name'列时,它会显示正确的输出。有什么问题?

另外,我想显示获得最低和最高利润的发布商的名称。为此,我运行以下查询:

select name, max(profit), min(profit) 
  from publisher;

它显示错误,例如“'name'不是聚合函数的一部分”。如何检索获得最低和最高利润的出版商名称。

4 个答案:

答案 0 :(得分:1)

  

列出charcter'a'的所有位置   来自名字。

要做到这一点,你需要一个数字或Tally表。如果您使用的是SQL Server 2005或更高版本,则可以使用公用表表达式对其进行模拟:

With Numbers As
    (
    Select 1 As Value
    Union All
    Select Value + 1
    From Numbers
    Where Value <= 100 --replace with max size of Publisher Name
    )
Select P.Name, N.Value
From Numbers As N
    Cross Join Publishers As P
Where Substring( P.Name, N.Value, 1 ) = 'a'
Option ( Maxrecursion 0);
  

另外,我想显示名称   最低和最低的出版商   最大利润。

With ProfitRanks As
    (
    Select Name
        , Rank() Over ( Order By Profit Asc ) As LowestProfitRnk
        , Rank() Over ( Order By Profit Desc ) As HighestProfitRnk
    From Publisher
    )
Select Name, Profit
From ProfitRanks
Where LowestProfitRnk = 1
    Or HighestProfitRnk = 1

答案 1 :(得分:0)

第二个问题需要一个小组:

选择名称,最大(利润),最小(利润)   来自出版商 按名称分组

答案 2 :(得分:0)

对于你的问题的第2部分假设profit的索引我会使用。

select name,
       profit
FROM   (SELECT TOP(1) with ties name,
                                profit
        FROM   publisher
        ORDER  BY profit) mx
UNION
select name,
       profit
FROM   (SELECT TOP(1) with ties name,
                                profit
        FROM   publisher
        ORDER  BY profit DESC) mn  

这可以满足于2指数在开始时寻求一个,在指数末尾寻找一个。

答案 3 :(得分:0)

RE:PATINDEX功能的问题是因为基本上你想要知道字母第一次出现的位置&#39; a&#39;在价值中。这就是PATINDEX的工作原理(见MSDN: PATINDEX (Transact-SQL))。

如果您想获得每次出现的位置,那么您需要递归搜索字符串。 Robyn Page&amp; Phil Factor在string manipluation at www.Simple-Talk.com

上有一些很棒的文章

MAX和MIN功能是聚合功能。使用聚合函数时,所有列必须包含在聚合或GROUP BY子句中。

这可以为您提供您正在寻找的内容:

select name, max(profit), min(profit)
  from publisher
 group by name