我有一个变量,其|
分隔值如下所示。
我需要确保它永远不会有超过30个由'|'
分隔的序列,所以我相信如果我计算var中'|'
的出现次数就足够了
class=1111|2222|3333|4444
请你帮忙写一下xquery
。
我是xquery
的新手。
答案 0 :(得分:2)
如果删除了除栏后的所有字符,然后使用let $s := '1111|2222|3333|4444' return string-length(translate($s, translate($s, '|', ''), ''))
中的字符串长度,则会获得|
个字符的数量。使用string-length和double translate来删除除了某个字符之外的任何东西都是一个旧的XPath 1技巧,当然XQuery也有replace
你也可以使用let $s := '1111|2222|3333|4444' return string-length(replace($s, '[^|]+', ''))
。
答案 1 :(得分:1)
您可以使用tokenize()
函数按SELECT
COUNT(*) OVER () AS TotalRowsFound,
dt.*
FROM
(
SELECT
t.Title
, t.ItemID
, t.UploadDate
, t.SevenDaySales as SelectedColumnSales
, t.QuantitySold
, t.CurrentPrice
, t.CurrentPrice as LastSalePrice
FROM
dbo.SearchedUserItems t
WHERE
T.SearchedUserID = 5
) dt
GROUP BY ItemID, UploadDate, SelectedColumnSales, QuantitySold, CurrentPrice, LastSalePrice
ORDER BY SelectedColumnSales DESC
OFFSET + 55*0 ROWS FETCH NEXT 55 ROWS ONLY;
字符拆分值,然后使用fn:count()
计算序列中的项目数。
请记住,tokenize函数使用正则表达式模式,因此您需要将|
转义为|
:
\|
答案 2 :(得分:0)
只是为了好的衡量标准,如果你想进行任何性能比较,你可以试试
let $sep := string-to-codepoints('|')
return count(string-to-codepoints($in)[.=$sep])
这具有理论上的优势(至少在Saxon中)它不会在内存中构造任何新的字符串或序列。