Sql 不使用带条件的字符串函数检查回文
我有一张桌子。 如果我只想要employeename字符为1到5的记录 将是回文的,还有一个条件,如总字符数大于10,然后是4到8,如果字符数小于7,那么是2到5,如果字符数小于5,那么将检查所有字符,并且只有回文字符才会显示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个字符的
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