0

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

SELECT VersionNumber, [Description], 
FROM tblVersions

并且值VersionNumber可能是 编辑:来发现一个整数可以是一个值,例如 1、25、100 等。所以在这种情况下CHARINDEX并且LEFT不会工作。

 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)
4

3 回答 3

2

也许你想要类似的东西:

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

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

于 2013-04-12T21:45:04.293 回答
0

获取主要版本的最简单方法可能是附加句点并使用 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)来完成。

于 2013-04-15T17:12:04.847 回答
0

我最初对 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

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

于 2013-04-15T16:42:35.967 回答