【问题标题】:SQL retrieve string that have special characterSQL 检索具有特殊字符的字符串
【发布时间】:2019-09-10 00:15:52
【问题描述】:

我正在尝试编写一个查询,该查询仅选择末尾带有“+”的值。

这些值是用户从为他们提供参考 cmets 列表的屏幕中选择的文本片段。一段文本末尾可以有不同的特殊字符:'+' 或 '~' 或 '|'

这些值存储在单个列中,并且是混合的。

对于这项任务,我只需要获取以“+”结尾的 cmets。

以下是存储的文本示例:

    Addendum and/or contract providing additional event details and conditions.+

There are charges for these services.+

Notify Mall Crew of electrical needs for activities.+

Provide and maintain access to the Hotel1 during event.~

Provide and maintain access to the Hotel2 during event.~

Event organizer/sponsor is responsible for cleanup of event area1.|

Event organizer/sponsor is responsible for cleanup of event area2.|

这是我的查询(不工作)它什么都不返回。

SELECT
    COMMENT
FROM 
    PERMIT A
INNER JOIN 
    PROCESS G ON A.CODE = G.CODE 
WHERE  
    RIGHT(COMMENT, 2) = '+'
    AND COMMENT <> ''   

非常感谢您的帮助。

【问题讨论】:

  • 试试 where comment like '%\r%where comment like '%\r - 你的 cmets 末尾可能有空格,这会弄乱你的右边 2。
  • 你的意思是\r,就像“一个反斜杠字符后跟一个小写的r”,还是你的意思是“一个回车,由许多C-支持的\r转义序列表示。喜欢语言”?换句话说,您是直接在数据库中看到这些字符,还是在某处的客户端代码中看到这些字符?
  • @APH 如果 \r 在中间某处,很容易返回误报。
  • 右后的一切都只是噪音。评论怎么可能是 NULL 并且 LEN 不长于 0?如果长度大于 0,它怎么可能是一个空字符串?我认为一个简单的“LIKE '%\r'”会比所有这些东西更简单地替代整个 where 子句。但正如@JeroenMostert 指出的那样,您可能并不是真的在寻找那个字符串,而是在寻找一个 char(10) 或 char(13)
  • 以及您发布的示例数据。那是代表一行数据,还是代表七行数据?

标签: sql sql-server tsql text data-retrieval


【解决方案1】:

所以我没有测试这个,它可能有错别字,但基本思想是将你的文本转换为XML,然后使用XML工具查询结果。这比尝试解析具有动态行数的字符串要容易得多。

首先,我们从表中提取 xml 字符串,将整个内容转换为每行都有行的 xml 字符串,并在 CR LF 上使用 replace 来制作分隔符:

SET @xmlstr  = 
  SELECT CAST('<file><row>' + REPLACE(COMMENT,CHAR(13)+CHAR(10),'</row><row>') + '</row></file>' AS XML)
  FROM PERMIT A
  INNER JOIN PROCESS G ON A.CODE = G.CODE 

然后从 XML 中选择你想要的行

SELECT line.a_row
FROM    @xmlstr.nodes('/file') AS line(a_row)
WHERE right(line.a_row,1) = '+'

您可以在本网站和网络上找到许多使用此技巧(转换为 xml 以帮助解析)的示例。

【讨论】:

  • 您好,Hogan,前几天我病了,没工作。我今天刚回来,会试试你的推荐。谢谢你的帮助,我会报告我是否成功。最好的问候。
  • 我正在尝试检索 XML 列的内容,但我收到一条错误消息:从 nodes() 方法返回的列 'a_row' 不能直接使用。它只能用于四种 XML 数据类型方法之一,exist()、nodes()、query() 和 value(),或者用于 IS NULL 和 IS NOT NULL 检查。
  • 我成功了。它最后返回带有 '+) 的文本。现在的问题是我有 3 个带有“+”的句子,而 SELECT 只返回第一个。你有什么建议可以解决这个问题吗?
  • '提供额外活动详情和条件的附录和/或合同。 +活动需要特别值班人员。这些服务是收费的。+通知商场工作人员活动的电力需求。+人行道必须保持 8' 人行道活动区域。~在活动期间提供和维护进入酒店的通道。~活动组织者/赞助商负责清理活动区域。 |'
  • @erasmocarlos 我的选择语句应该返回所有 3 个
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2011-04-11
  • 2012-09-07
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多