我有以下说明:'示例产品制造商产品名称XYZ - 尺寸',我想从此获得值'产品名称XYZ'。如果这只是一行我只是使用SUBSTRING没有问题,但我有数千条记录,虽然初始值Sample Product Maker对于所有产品都是相同的,但产品名称可能不同,我不想要任何东西。连字符。
到目前为止,我已经在这个问题的标题中产生了错误。
SELECT i.Itemid,
RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos
FROM t_items i
我得到'参数数据类型varchar对于子字符串函数'
的参数3无效正如您所看到的,我获取了sql语句最后一行的值,但是当我尝试将其插入SUBSTRING函数时,我遇到了各种问题。
答案 0 :(得分:20)
很可能你的行中缺少' - ',这会导致你的错误。 试试这个......
SELECT i.Itemid,
SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev,
FROM t_items i
答案 1 :(得分:1)
您对[{1}}的第一次通话指定的长度为SUBSTRING
。
您可以尝试:
SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25))
答案 2 :(得分:1)
您也可以删除Sample Product Maker
文字并从那里开始:
SELECT RTRIM(LEFT(
LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', '')),
CHARINDEX('-', LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker',
'' ))) - 1))
AS ShortDescription
答案 3 :(得分:1)
问题是您对SUBSTRING
的外部调用是从第三个参数中的内部SUBSTRING
调用传递的字符数据类型。
+--This call does not return an integer type
SELECT i.Itemid, V
RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos
FROM t_items i
第三个参数必须评估为您想要的长度。也许你的意思是LEN(SUBSTRING(...))
?
答案 4 :(得分:0)
好像你想要这样的东西(22,而不是25):
SELECT i.Itemid,
RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription)-22))) AS ProductDescriptionAbbrev,
CHARINDEX('-', i.ShortDescription)-22 as charindexpos
FROM t_items i
答案 5 :(得分:0)
你想:
LEFT(i.ShortDescription, isnull(nullif(CHARINDEX('-', i.ShortDescription),0) - 1, 8000))
请注意,一个好的做法是用charindex(...)
包装patindex(...)
和nullif(...,0)
,然后根据需要处理null case(有时null是正确的结果,in在这种情况下,我们需要所有文本,以便我们isnull(...,8000)
获得我们想要的长度。