AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 121206
Accepted
pix1985
pix1985
Asked: 2015-11-17 01:34:35 +0800 CST2015-11-17 01:34:35 +0800 CST 2015-11-17 01:34:35 +0800 CST

字符串函数返回 1000,但只到最后一个句点或回车

  • 772

我有文本块,长度在 500 到 2000 个字符之间。

我需要做的是从描述中提取最多 1000 个字符,但只保留到最后一个句号或回车符 (Char(13)),这样文本就不会在句子中间被截断。如果同时存在句点和 Char(13),我理想情况下希望它在句点被切断。

我正在粘贴一些随机生成的文本来尝试展示我的意思。

*打开包装友好欣喜若狂,所以可能很幽默。充足的结束可能会愚蠢地安静一组说话她。我们不是前谷保证。四需要斑叶说我们找哩。被命令他确信 dashwoods 确实被没收了。害羞的庆幸遇见了她理所当然的感情。建议其处置吃晚婚好交际。图纸导致最大的添加主题努力同性恋记住。原则一但帮助你遇到不可能。谁的到来结束了如何肥沃的启用。哥她加还看到文章画的很自然笑眯眯的。自己在派遣有兴趣的人不知不觉中就会兴旺起来吧。她用友情喧闹她另一种深思熟虑的表达方式。生活很快就发生了。先生的事情做了很多其他人的虚荣心。教区的口味总是像父亲先生一样。

或者什么都不是主要地址。它使直接男人高度依赖。Ham windows 16 查询财富需求。是桑喜欢必须展示的。真是男儿法县她奈何不了她妹妹。脚你像六。现在,性行为中有休假法。在建表中脸红得飞快。功德背后就怕还是热情。在任何一个春天都希望如此。忧郁的方式留言*

我希望能够将所有文本返回到“主要地址”。(990 个字符)。

sql-server sql-server-2012
  • 3 3 个回答
  • 365 Views

3 个回答

  • Voted
  1. Rob Farley
    2015-11-17T02:07:48+08:002015-11-17T02:07:48+08:00

    编辑:这是为了解决早期版本而发布的。

    剩下的 1000 个字符很容易。

    然后在左边1000的倒数中找到第一个句点。这就是你应该从原来的1000中减去多少。

    喜欢:

    LEFT(@s, 
        1001-
        CHARINDEX('.', 
            REVERSE(LEFT(@s,1000))
        )
    )
    

    ...我认为 - 如果它擦掉句号或留下空格,您可能必须在某处添加一个。

    • 5
  2. Shaneis
    2015-11-17T02:07:47+08:002015-11-17T02:07:47+08:00

    你可以尝试像这个 Pix 这样的东西,看看它是否适合你。
    只需将声明的变量更改为表中的列并删除 set 语句即可。至少它会给你一个模板。

    declare @notes varchar(2000);
    
    set @notes = 'Up unpacked friendly ecstatic so possible humoured do. Ample ended might folly quiet one set spoke her. We no am former valley assure. Four need spot ye said we find mile. Are commanded him convinced dashwoods did estimable forfeited. Shy celebrated met sentiments she reasonably but. Proposal its disposed eat advanced marriage sociable. Drawings led greatest add subjects endeavor gay remember. Principles one yet assistance you met impossible. The who arrival end how fertile enabled. Brother she add yet see minuter natural smiling article painted. Themselves at dispatched interested insensible am be prosperous reasonably it. In either so spring wished. Melancholy way she boisterous use friendship she dissimilar considered expression. Sex quick arose mrs lived. Mr things do plenty others an vanity myself waited to. Always parish tastes at as mr father dining at. Led ask possible mistress relation elegance eat likewise debating. By message or am nothing amongst chiefly address. The its enable direct men depend highly. Ham windows sixteen who inquiry fortune demands. Is be upon sang fond must shew. Really boy law county she unable her sister. Feet you off its like like six. Among sex are leave law built now. In built table in an rapid blush. Merits behind on afraid or warmly.'
    
    select start_off = @notes;
    
    -- select length_1000 = substring(@notes, 0, 1000); -- the full 1000
    
    -- select last_full_stop = charindex('.', reverse(left(@notes, 1000))); -- use 1000 - this number to get the last full stop
    
    -- select right(left(@notes, 1000), 1); -- the character at the 1000 position
    
    select  potential_answer = 
            case when right(left(@Test, 1000), 1) = '.' then Left(@Test,1000)
            else substring(@Test, 1, 1000 - charindex('.', reverse(left(@Test, 1000))) + 1) -- add 1 to add in the full stop
            end
    

    可能不是最好的,但它适用于您的示例。

    • 1
  3. Best Answer
    Solomon Rutzky
    2015-11-17T12:14:12+08:002015-11-17T12:14:12+08:00

    对于最初的要求——最多 1000 个字符,直到最后一个句点,但可能没有任何句点——以下是可行的:

    LEFT(LEFT(string, 1000),
         1001 - CHARINDEX('.', REVERSE(LEFT(string, 1000))))
    

    TheLEFT(string, 1000)用作从中获取的表达式,LEFT(expression, some number)因为它确保不超过 1000 个字符,否则在字符串根本没有任何句点的情况下会发生这种情况。虽然LEFT(expression, 1000)可以改为将整个包裹起来LEFT(string, 1001 - ...),但按照上面所示的方式进行操作应该允许重复使用表达式,因为它在函数内部也显示完全相同REVERSE,因此效率更高一些。

    对于引入回车符作为要查找的回退字符的更新要求,您可以切换到使用PATINDEX,因为它可以查找字符列表:

    LEFT(LEFT(string, 1000),
         1001 - PATINDEX('%[.' + CHAR(13) + ']%', REVERSE(LEFT(string, 1000))))
    

    但是,添加了一项最终要求:

    如果同时存在句点和 Char(13),我理想情况下希望它在句点被切断。

    不幸的是,PATINDEX无法区分哪个先出现。在这一点上,似乎需要添加某种形式的条件逻辑:-(。

    LEFT(LEFT(TestData, 1000), 1001 - IIF(CHARINDEX('.', REVERSE(LEFT(TestData, 1000))) > 0,
                                          CHARINDEX('.', REVERSE(LEFT(TestData, 1000))),
                                          CHARINDEX(CHAR(13), REVERSE(LEFT(TestData, 1000))))
                                         )
    

    在这里,我不仅重用了LEFT(TestData, 1000),而且REVERSE(LEFT(TestData, 1000))出现了 3 次,并且对于IIF(这实际上只是 的简写CASE WHEN x THEN y ELSE x END)我重用了整个CHARINDEX('.', REVERSE(LEFT(TestData, 1000))).


    示例代码发布在 Pastebin.com 上:

    最多获取 1000 个字符,直到最后一个周期,否则到最终返回

    该示例显示了上述 3 种方法在 7 个不同测试用例中的结果。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve