获取介于两个字符之间的字符串值
Getting a string value that is between two characters
我需要获取介于 !03 和 !03 之间的值。
示例:
JDC!0320151104!03OUT
我应该在 return 中得到以下字符串:20151104
注意:字符串并不总是 22 个字符长,但我只关心 !03 和 !03 之间的值。
这就是我目前所拥有的。我无法取得比这更进一步的任何进展:
SELECT
SUBSTRING(
RegStatsID,
CHARINDEX('!', RegStatsID) + 3,
CHARINDEX('!', REVERSE(RegStatsID))
)
From TableX
我通过执行以下操作得到了正确的结果:
SELECT
SUBSTRING(
RegStatsID,
CHARINDEX('!', RegStatsID) + 3,
len(RegStatsID) - CHARINDEX('!', RegStatsID ) - 2 - CHARINDEX('!', Reverse(RegStatsID))
)
太好了,您找到了解决方案!
这可能会更好:
通过用 XML 标签替换“!03”,您可以轻松选择第二个 "node"。您的字符串将被转换为 <x>JDC</x><x>20151104</x><x>OUT</x>
:
DECLARE @test VARCHAR(100)='JDC!0320151104!03OUT';
SELECT CAST('<x>' + REPLACE(@test,'!03','</x><x>') + '</x>' AS XML).value('/x[2]','datetime')
一个优点是获得两个键入的“!03”之间的值。在这种情况下,您会得到一个 "real" 日期时间,而无需任何进一步的转换。如果值在所有情况下都没有日期时间(或日期),则只需使用 nvarchar(max)
作为类型。
另一个优点是:如果你 - 为什么 - 以后需要其他值,你只需将它们与 .value('/x[1 or 3]'...)
我需要获取介于 !03 和 !03 之间的值。
示例:
JDC!0320151104!03OUT
我应该在 return 中得到以下字符串:20151104
注意:字符串并不总是 22 个字符长,但我只关心 !03 和 !03 之间的值。
这就是我目前所拥有的。我无法取得比这更进一步的任何进展:
SELECT
SUBSTRING(
RegStatsID,
CHARINDEX('!', RegStatsID) + 3,
CHARINDEX('!', REVERSE(RegStatsID))
)
From TableX
我通过执行以下操作得到了正确的结果:
SELECT
SUBSTRING(
RegStatsID,
CHARINDEX('!', RegStatsID) + 3,
len(RegStatsID) - CHARINDEX('!', RegStatsID ) - 2 - CHARINDEX('!', Reverse(RegStatsID))
)
太好了,您找到了解决方案!
这可能会更好:
通过用 XML 标签替换“!03”,您可以轻松选择第二个 "node"。您的字符串将被转换为 <x>JDC</x><x>20151104</x><x>OUT</x>
:
DECLARE @test VARCHAR(100)='JDC!0320151104!03OUT';
SELECT CAST('<x>' + REPLACE(@test,'!03','</x><x>') + '</x>' AS XML).value('/x[2]','datetime')
一个优点是获得两个键入的“!03”之间的值。在这种情况下,您会得到一个 "real" 日期时间,而无需任何进一步的转换。如果值在所有情况下都没有日期时间(或日期),则只需使用 nvarchar(max)
作为类型。
另一个优点是:如果你 - 为什么 - 以后需要其他值,你只需将它们与 .value('/x[1 or 3]'...)