【问题标题】:Get the max number in a varchar column SQL Server获取 varchar 列 SQL Server 中的最大数量
【发布时间】:2018-06-29 16:30:59
【问题描述】:

我有一个 varchar 列,其中包含逗号分隔的数字。 我想获取该列中的最大数量。

+-------------------+--------------+
| reference_no      | Name         |
+-------------------|--------------+
| 17530, 20327      | John         |
| , 14864           | Smith        |
| 8509              | Michael      |
| 14864, 17530      | Kelly        |
+-------------------+--------------+

因此,在上述列 (reference_no) 示例中,输出应为 20327。

然后我必须选择包含这个数字的行。

【问题讨论】:

  • 你能先修复数据吗?对于此类数据,没有任何查询可以有效!
  • 规范化你的数据——现在你需要使用string splitter
  • 我正在使用下面的查询对其进行规范化,但它没有给出所需的输出。 select substring(reference_no,charindex(',',reference_no)+1,len(reference_no)-charindex(',',reference_no)), reference_no from table_name

标签: sql-server numbers integer max varchar


【解决方案1】:

假设不是 2016+

如果您在任何特定行中的 reference_no 中的值不超过 4 个,那么可能是 parsename()

如果超过 4 个,您可能需要修复数据或使用拆分/解析功能。

示例

Select MaxValue = max(V)
 From  YourTable A
 Cross Apply ( values (replace([reference_no],',','.')) ) B(S)
 Cross Apply ( values (try_convert(int,parsename(S,1)))
                     ,(try_convert(int,parsename(S,2)))
                     ,(try_convert(int,parsename(S,3)))
                     ,(try_convert(int,parsename(S,4)))
             ) C(V)

退货

MaxValue
20327

【讨论】:

  • reference_no 列的值超过 20000 个。
  • 我正在使用下面的查询,但它没有给出正确的输出。 select substring(reference_no,charindex(',',reference_no)+1,len(reference_no)-charindex(',',reference_no)), reference_no from table_name
  • @ArunkumarYadav 在示例数据中,这是 4 行还是 1 行有 6 个 reference_no 的?
【解决方案2】:

尝试以下方法:

declare @tab table (reference_no varchar(max), [Name] varchar(100))
insert into @tab
select  '17530, 20327','John'    union
select  ', 14864     ','Smith'   union
select  '8509        ','Michael' union
select  '14864, 17530','Kelly' 

create table #final (val int)

insert into #final
    SELECT Split.a.value('.', 'VARCHAR(100)') AS String
    FROM  (SELECT reference_no reference_no,  
            CAST ('<S>' + REPLACE(reference_no, ',', '</S><S>') + '</S>' AS XML) AS String  
        FROM @tab) AS A CROSS APPLY String.nodes ('/S') AS Split(a);

select * from @tab where reference_no like '%'+ (select convert(varchar(100), max(val)) from #final) + '%'
drop table #final

【讨论】:

  • 这里不用循环了。
猜你喜欢
  • 2011-01-05
  • 2012-03-24
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多