2015-05-02 35 views
1

我有一個表EmployeeTable
如果我只想要其中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) 

我想做的事情,沒有字符串函數, 任何人都可以幫助我在此?

+2

請問你爲什麼不要使用字符串函數? – PeterRing

+1

你想在不使用字符串函數的情況下進行字符串操作?你的問題沒有意義。 –

+0

你正在使用哪些DBMS? Postgres的?甲骨文? –

回答

0

我不明白爲什麼你不想在你的查詢中使用字符串函數,但這裏是一個解決方案。預先計算的一切:

添加列:

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 

BUT! 這不是一個好主意。請告訴我們,爲什麼你不想使用字符串功能。

+0

我知道字符串函數是選項,但它是在函數中構建的,我已經能夠使用該函數獲得輸出,例如字符串反轉和子字符串,但是我想這樣做,而不使用字符串函數。 –

1

你至少需要SUBSTRING(),我有這樣一個解決方案: (在SQL Server

DECLARE @txt varchar(max) = 'abcba' 

;WITH CTE (cNo, cChar) AS (
    SELECT 1, SUBSTRING(@txt, 1, 1) 
    UNION ALL 
    SELECT cNo + 1, SUBSTRING(@txt, cNo + 1, 1) 
    FROM CTE 
    WHERE SUBSTRING(@txt, cNo + 1, 1) <> '' 
) 
SELECT COUNT(*) 
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY cNo DESC) as cRevNo 
    FROM CTE t1 CROSS JOIN 
     (SELECT Max(cNo) AS strLength FROM CTE) t2) dt 
WHERE 
    dt.cNo <= dt.strLength/2 
    AND 
    dt.cChar <> (SELECT dti.cChar FROM CTE dti WHERE dti.cNo = cRevNo) 

結果會顯示不同的計數和0意味着沒有分歧。

注:
目前的解決方案是將其更改爲您需要檢查區分大小寫的排序規則的字符串像Latin1_General_BIN

一個 區分大小寫 不區分大小寫

你可以使用這個解決方案作爲SVF或類似的東西。

+0

我不想使用偶數子串。 –

0

您可以使用生成迴文詞直到字符長度的遞歸查詢構建迴文詞列表,然後選擇名稱與迴文詞匹配的員工。這可能是一種非常低效的方式,但它確實有效

這是一個sample query for Oracle,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 
)