检查回文

时间:2017-11-21 07:53:15

标签: sql-server sql-server-2008

我们有一个字符串变量,我们捕获下面列出的字符串: 字符串式>>

  • 临时表温度| Temp1表1 Temp1 | Temp2表2 Temp2 | ABD EFG EFG

现在我们需要检查,在这个特定字符串中存在多少Palindromes。

那么,你能帮我解决这个问题吗,我怎么能得到Palindrome计数的数量。

注意:“|”每次成功完成字符串后,此管道都会存在。

答案:3

我编写的查询,我使用了Reverse()/ Replace()函数,但无法理解如何在每个管道符号后拆分字符串。

所以,请帮助我这样做,我是SQL Server的初学者。

1 个答案:

答案 0 :(得分:-1)

看起来你真的不知道回文是什么,所以如果其他人遇到这个问题,我会把几个方法放在一起,寻找实际的答案,或者像你的情况那样误解。

首先检查字符串值是否是正确的回文(即:拼写相同的向前和向后)这是原始字符串与其reverse值的简单比较,在下面的示例中正确输出{ {1}}:

1

要在同一个字符串中的一组分隔值中执行此操作,首先应该感觉不适合将数据存储在数据库中的分隔字符串中,并考虑为什么要这样做。说真的,这是非常糟糕的设计,你应该尽快解决它。完成后,您可以应用上述技术。

这是真正不可避免的,但是,您可以使用许多基于集合的表值函数之一拆分字符串,然后在输出上应用上述操作。我已经包含了我在这里使用的函数:

declare @p nvarchar(100) = 'Temp Table elbaT pmeT';

select case when @p = reverse(@p)
            then 1
            else 0
            end as p

哪个输出:

declare @ps nvarchar(100) = 'Temp Table elbaT pmeT | Temp1 Table1 1elbaT 1pmeT | Temp2 Table2 Temp2 | ABD EFG EFG';

select ltrim(rtrim(s.item)) as s
      ,case when ltrim(rtrim(s.item)) = reverse(ltrim(rtrim(s.item))) then 1 else 0 end as p
from dbo.fn_StringSplit4k(@ps,'|',null) as s

要做你实际要求的事情,在比较整个单词时要多一些。为此,您可以在分隔符上拆分字符串,然后在空格上再次分割结果。使用这个有序的单词列表,您可以按顺序将单词按顺序进行比较,看它们是否相同:

+---------------------------+---+
|             s             | p |
+---------------------------+---+
| Temp Table elbaT pmeT     | 1 |
| Temp1 Table1 1elbaT 1pmeT | 1 |
| Temp2 Table2 Temp2        | 0 |
| ABD EFG EFG               | 0 |
+---------------------------+---+

哪个输出:

declare @s nvarchar(100) = 'Temp Table Temp | Temp1 Table1 Temp1 | Temp2 Table2 Temp2 | ABD EFG EFG';

with w as
(
    select s.item as s
          ,ss.rn
          ,row_number() over (partition by s.item order by ss.rn desc) as rrn
          ,ss.item as w
    from dbo.fn_StringSplit4k(@s,'|',null) as s
        cross apply dbo.fn_StringSplit4k(ltrim(rtrim(s.item)),' ',null) as ss
)
select w.s
      ,case when sum(case when w.w = wr.w then 1 else 0 end) = max(w.rn) then 1 else 0 end as p
from w
    join w as wr
        on w.s = wr.s
            and w.rn = wr.rrn
group by w.s
order by w.s

字符串拆分功能:

+----------------------+---+
|          s           | p |
+----------------------+---+
|  ABD EFG EFG         | 0 |
|  Temp1 Table1 Temp1  | 1 |
|  Temp2 Table2 Temp2  | 1 |
| Temp Table Temp      | 1 |
+----------------------+---+