【问题标题】:T-SQL 'InString' or Remove operationT-SQL 'InString' 或删除操作
【发布时间】:2013-04-05 10:59:58
【问题描述】:

是否可以执行某种内联操作来删除正在检索的值的某个部分?例如,我有

SELECT VersionNumber, [Description], 
FROM tblVersions

VersionNumber 的值可能是 编辑:发现整数可以是 1、25、100 等值。所以在这种情况下,CHARINDEXLEFT 将不起作用。

 1.1
 1.55
10.01
10.99
99.1 (a)
50.17 Interim

我需要做的是在句号之后剪切所有内容(值类型为VARCHAR)。这是PIVOT 查询的一部分(见下文),因此实际的Select 语句是固定字符串的一部分。

SELECT 
   @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + [Description] 
FROM 
   GIIA.vQualScoringGrade 
ORDER BY 
   '],[' + [Description] 
FOR XML PATH('')), 1,2,'') + ']'

SET @query = N'SELECT VersionNumber, ' + @cols + 
              ' FROM (SELECT VersionNumber, Description, Value, OrderBy FROM GIIA.vQualScoringGrade) p
PIVOT (SUM([Value]) for [Description] IN ( ' + @cols + ' )) AS pvt ORDER BY VersionNumber'

execute(@query)

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

也许你想要类似的东西:

LEFT(VersionNumber, CHARINDEX('.',VersionNumber + '.')-1)

添加自己的句点是一个小技巧,无论原始字符串中是否有句点,它都能正常工作。

【讨论】:

    【解决方案2】:

    我最初对 VersionNumber 字段中可以有什么样的值的理解是关闭的。基本上我可以有文本、看起来像小数的数字或整数。要求是将此归档保留为“开放”文本,这对程序员来说很困难,但还有什么新内容?

    正如@Pondlife 建议的那样,我已经实现了SELECT CASE 语句,并且大部分情况下它都有效 - 我有订购问题,但我可以稍后处理。

    我最终修改了像这样提供 sproc 的视图:

     SELECT CASE CHARINDEX('.', VersionNumber) WHEN 0 THEN VersionNumber ELSE REPLACE(LEFT(VersionNumber, CHARINDEX('.', VersionNumber)), '.', '') 
     END AS [Award Fee Period], 'Unsatisfactory' AS Description, COUNT(Description) AS GradeCount, 6 AS OrderBy
     FROM GIIA.vQualScoringGrade
    

    非常感谢所有做出贡献的人!

    【讨论】:

      【解决方案3】:

      获取主要版本的最简单方法可能是附加句点并使用left/charindex:

      select left(VersionNumber, charindex('.', VersionNumber + '.') - 1) as Major
      from tblVersions
      

      我还使用 parsename 来获取版本号的所有四个部分:

      select VersionNumber
          , parsename(VersionNumber + replicate('.0', 3 - (len(VersionNumber) - len(replace(VersionNumber, '.', '')))), 4) as Major
          , parsename(VersionNumber + replicate('.0', 3 - (len(VersionNumber) - len(replace(VersionNumber, '.', '')))), 3) as Minor
          , parsename(VersionNumber + replicate('.0', 3 - (len(VersionNumber) - len(replace(VersionNumber, '.', '')))), 2) as Build
          , parsename(VersionNumber + replicate('.0', 3 - (len(VersionNumber) - len(replace(VersionNumber, '.', '')))), 1) as Revision
      from tblVersions
      

      使用句点分隔的四个元素以外的任何内容可能最好使用任意数量的 T-SQL 拆分器(Tally、CTE、UDF、XML)来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多