Sql 不使用带条件的字符串函数检查回文

Sql 不使用带条件的字符串函数检查回文,sql,string,Sql,String,我有一张桌子。 如果我只想要employeename字符为1到5的记录 将是回文的,还有一个条件,如总字符数大于10,然后是4到8,如果字符数小于7,那么是2到5,如果字符数小于5,那么将检查所有字符,并且只有回文字符才会显示 Examples :- neen will be display neetan not selected kiratitamara will be selected 我在字符串函数上尝试了这个方法,比如第一个小于5个字符的

我有一张桌子。 如果我只想要employeename字符为1到5的记录 将是回文的,还有一个条件,如总字符数大于10,然后是4到8,如果字符数小于7,那么是2到5,如果字符数小于5,那么将检查所有字符,并且只有回文字符才会显示

Examples :- neen will be display
            neetan not selected
            kiratitamara will be selected
我在字符串函数上尝试了这个方法,比如第一个小于5个字符的名字

SELECT SUBSTRING(EmployeeName,1,5),* from EmaployeeTable where 
          REVERSE (SUBSTRING(EmployeeName,1,5))=SUBSTRING(EmployeeName,1,5)
我想在没有字符串函数的情况下这样做,
有人能帮我吗?

我真的不明白你为什么不想在查询中使用字符串函数,但这里有一个解决方案。事先计算一切:

添加列:

 ALTER TABLE EmployeeTable
            ADD SubString AS 
            SUBSTRING(EmployeeName,
               (
               CASE WHEN LEN(EmployeeName)>10 
               THEN 4
               WHEN LEN(EmployeeName)>7
               THEN 2
               ELSE 1 END
               )
            ,
            (
               CASE WHEN LEN(EmployeeName)>10 
               THEN 8
               WHEN LEN(EmployeeName)>7
               THEN 5
               ELSE 5 END
               )
             PERSISTED
        GO

            ALTER TABLE EmployeeTable
            ADD Palindrome AS 
            REVERSE(SUBSTRING(EmployeeName,
               (
               CASE WHEN LEN(EmployeeName)>10 
               THEN 4
               WHEN LEN(EmployeeName)>7
               THEN 2
               ELSE 1 END
               )
            ,
            (
               CASE WHEN LEN(EmployeeName)>10 
               THEN 8
               WHEN LEN(EmployeeName)>7
               THEN 5
               ELSE 5 END
               )) PERSISTED
        GO
然后您的查询将如下所示:

    SELECT * from EmaployeeTable 
    where Palindrome = SubString
但是! 这不是一个好主意。请告诉我们,为什么您不想使用字符串函数。

您至少需要子字符串,我有这样一个解决方案: 在SQL Server中

结果将显示差异计数,0表示无差异

注: 当前解决方案不区分大小写,如果要将其更改为区分大小写,则需要在区分大小写的排序规则(如Latin1_General_BIN)中检查字符串


您可以将此解决方案用作SVF或类似的解决方案。

您可以使用递归查询生成回文单词列表,生成长度为n个字符的回文单词,然后选择名称与回文单词匹配的员工。这可能是一种非常低效的方法,但它确实奏效了

这是一个很好的例子,PostgreSQL应该也支持这个特性,但在语法上没有什么不同。我不知道其他RDBMS

with EmployeeTable AS (
    SELECT 'ADA' AS employeename
    FROM DUAL
    UNION ALL
    SELECT 'IDA' AS employeename
    FROM DUAL
    UNION ALL
    SELECT 'JACK' AS employeename
    FROM DUAL
  ), letters as (
    select chr(ascii('A') + rownum - 1) as letter
    from dual
    connect by ascii('A') + rownum - 1 <= ascii('Z')
  ), palindromes(word, len ) as (
    SELECT WORD, LEN
    FROM (
        select CAST(NULL AS VARCHAR2(100)) as word, 0 as len
        from DUAL
        union all
        select letter as word, 1 as len
        from letters
      )
    union all
    select l.letter||p.word||l.letter AS WORD, len + 1 AS LEN
    from palindromes p
      cross join letters l
    where len <= 4
  )
  SEARCH BREADTH FIRST BY word SET order1
  CYCLE word SET is_cycle TO 'Y' DEFAULT 'N'
select *
from EmployeeTable
WHERE employeename IN (
    SELECT WORD
    FROM palindromes
  )

我可以问你为什么不想使用字符串函数吗?你想在不使用字符串函数的情况下进行字符串操作吗?您的问题没有意义。您使用的是哪种数据库管理系统?博士后?Oracle?你说的字符串函数是什么意思?Lenghtvarchar2也可以被视为字符串函数,因为它接收字符串作为参数!如果不使用字符串函数,则无法检查字符串的条件。我不想使用类似字符串反转和子字符串的函数,因此我告诉您我不想使用字符串内置函数。我甚至不想使用子字符串。我知道字符串函数是选项,但这是内置函数,我已经能够获得使用类似字符串反转和子字符串的函数进行输出,但我希望不使用字符串函数。
with EmployeeTable AS (
    SELECT 'ADA' AS employeename
    FROM DUAL
    UNION ALL
    SELECT 'IDA' AS employeename
    FROM DUAL
    UNION ALL
    SELECT 'JACK' AS employeename
    FROM DUAL
  ), letters as (
    select chr(ascii('A') + rownum - 1) as letter
    from dual
    connect by ascii('A') + rownum - 1 <= ascii('Z')
  ), palindromes(word, len ) as (
    SELECT WORD, LEN
    FROM (
        select CAST(NULL AS VARCHAR2(100)) as word, 0 as len
        from DUAL
        union all
        select letter as word, 1 as len
        from letters
      )
    union all
    select l.letter||p.word||l.letter AS WORD, len + 1 AS LEN
    from palindromes p
      cross join letters l
    where len <= 4
  )
  SEARCH BREADTH FIRST BY word SET order1
  CYCLE word SET is_cycle TO 'Y' DEFAULT 'N'
select *
from EmployeeTable
WHERE employeename IN (
    SELECT WORD
    FROM palindromes
  )
DECLARE @cPalindrome VARCHAR(100) = 'SUBI NO ONIBUS'

SET @cPalindrome = REPLACE(@cPalindrome, ' ', '')
;WITH tPalindromo (iNo) AS (
    SELECT 1
     WHERE SUBSTRING(@cPalindrome, 1, 1) = SUBSTRING(@cPalindrome, LEN(@cPalindrome), 1) 
    UNION ALL
    SELECT iNo + 1
      FROM tPalindromo
     WHERE SUBSTRING(@cPalindrome, iNo + 1, 1) = SUBSTRING(@cPalindrome, LEN(@cPalindrome) - iNo, 1) 
       AND LEN(@cPalindrome) > iNo
)

SELECT IIF(MAX(iNo) = LEN(@cPalindrome), 'PALINDROME', 'NOT PALINDROME')
  FROM tPalindromo