包含前缀term“06*”或简单术语“06”返回一个没有单词以“06”开头的值

ygya80vv  于 2022-10-22  发布在  其他
关注(0)|答案(1)|浏览(253)

我使用SQL Server的contains命令搜索名为text(nvarchar(max))的列,查询返回一行,其中文本值没有以“06”开头的单词,而单词中间有“06”。它是怎么来的?查询如下

select * from NCaseWildSearch  where  Contains(TEXT, '"06*" or "06"')

值是这样的

<_C153_>1067</_C153_><_C154_>100010</_C154_><_C156_>5</_C156_><_C157_>INV-20210617-120</_C157_><_C162_>Jun 17 2021  2:46PM</_C162_><_C165_>Jul 26 2021  1:21PM</_C165_>

我没有看到任何以“06”开头的单词,有20210617,但“06”定位在中间;确实有一个以Jun开头的单词,contains命令是否将其识别为“06”?真的不知道。谁能给我一些小费?谢谢

e0bqpujr

e0bqpujr1#

像搜索文本一样搜索XML并不总是您想要的。因为(例如)您也在搜索节点名称。
更好的方法可能是首先选择节点值:

WITH cte AS (
   SELECT CAST('<_C153_>1067</_C153_><_C154_>100010</_C154_><_C156_>5</_C156_><_C157_>INV-20210617-120</_C157_><_C162_>Jun 17 2021  2:46PM</_C162_><_C165_>Jul 26 2021  1:21PM</_C165_>' as xml) as xml
)
SELECT *
FROM (
   SELECT 
      T.v.query('.') as A,
      T.v.value('.','varchar(40)') as B
   FROM cte 
   CROSS APPLY cte.xml.nodes('//*') as T(v)
) x 
WHERE x.B LIKE '%06%'

输出:
|A |B|
| ------------ | ------------ |
|<C153>1067</C153>|1067|
|<C157>发票-20210617-120</C157>|发票-2021617-120|
注:这可能比直接搜索较大文本中的文本慢。
参见:DBFIDDLE

相关问题