使用SQL查找包含首字母缩略词(诗歌中隐藏的单词)的记录

使用SQL查找包含首字母缩略词(诗歌中隐藏的单词)的记录,sql,sql-server,regex,Sql,Sql Server,Regex,这是我的设想。我有一个包含varcharmax字段的数据库。在数据库中的一条记录中,此字段包含两段句子。输入这一特定记录的人做了一个隐藏单词的事情,即一行中每个句子的第一个字母构成一个单词。比如: My mother told me that I am the best artist she has seen. Can you believe it? Everyone else does. 这就产生了“老鼠”这个词。 使用SQL查询数据库,如何查找此记录 谢谢你的时间 这里有一种在Oracle

这是我的设想。我有一个包含varcharmax字段的数据库。在数据库中的一条记录中,此字段包含两段句子。输入这一特定记录的人做了一个隐藏单词的事情,即一行中每个句子的第一个字母构成一个单词。比如:

My mother told me that
I am the best artist she has seen.
Can you believe it?
Everyone else does.
这就产生了“老鼠”这个词。 使用SQL查询数据库,如何查找此记录


谢谢你的时间

这里有一种在Oracle中使用通用表表达式CTE实现的方法。下面的tbl_orig只是设置测试数据。这用多行列表示源数据

tbl_first包含一个行号列和一个多行列每行第一个字符的列。它使用connect by子句循环遍历每一行,设置用于稍后组合字母的行号,并抓取行锚点开头或新行后面的第一个字符

然后,最终的查询使用listag将行转换为一行。如果您的数据库不是Oracle,那么您可能会发现所涉及的步骤有助于解决问题,以便将逻辑应用于您的环境。记住,当你想出解决方案时,要把它贴出来

SQL> with tbl_orig(str) as (
     select 'My mother told me that
   I am the best artist she has seen.
   Can you believe it?
   Everyone else does.' from dual
   ),
   tbl_first(rn, ltr) as (
     select level rn, regexp_substr(str, '(^|\\r)(.)', 1, level, 'm', 2) ltr
     from tbl_orig
     connect by level <= regexp_count(str, '\r')+1
   )
   SELECT LISTAGG(ltr)
     WITHIN GROUP (ORDER BY rn) secret_word
   FROM tbl_first;

SECRET_WORD
-----------------------------------------------
MICE
编辑:简化查询。这实际上可以在一个语句中完成。与之前一样,tbl_orig只是原始数据。select获取每行的第一个字母,并在循环通过列的行时将它们组合在一起。不需要单独的CTE

而且“\r”似乎会导致空行出现问题。改为CHR10,现在可以使用了。Hmmm.Listagg忽略空值

SQL> with tbl_orig(str) as (
     select 'My mother told me that
   I am the best artist she has seen.

   Can you believe it?
   Everyone else does.

   Alas' from dual
   )
   SELECT LISTAGG(regexp_substr(str, '(^|'||CHR(10)'||)(.)', 1, level, 'm', 2))
   WITHIN GROUP (order by rownum) secret_word
   FROM tbl_orig
   connect by level <= regexp_count(str, CHR(10))+1;

SECRET_WORD
-----------
MICEA

SQL>

换行符是否也与文本一起保存在数据库中?您使用的是SQL Server、Mysql、Postgres、Oracle等哪些RDBMS?您是否有一个可能的单词表?这只是一个智力练习吗?SQL并不是完成这项工作的最佳工具。这可以用SQL来完成。您可能希望创建一个函数来拆分分隔符上的字符串,并且必须有一个分隔符,选择您的字符并将其压缩,或者将其填充回返回变量中,以生成隐藏字符串。这将取决于您使用的SQL类型以及您的语言中提供的功能。然而,这可能是非常低效的,我同意这不是SQL真正的工作