2016-04-14 23 views
11

Voglio interrogare l'elenco dei nomi dalla tabella STATION(id, city, longitude, latitude) che hanno le vocali come sia il loro primo che l'ultimo carattere. Il risultato non può contenere duplicati.Query SQL per verificare se un nome inizia e termina con una vocale

Per questo è stato scritto un quesito come WHERE NAME LIKE 'a%' che aveva 25 condizioni, ogni vocale per ogni altra vocale, che è piuttosto ingombrante. C'è un modo migliore per farlo?

+1

Idee: un'espressione regolare o 'sinistra()'/'destra()'. –

risposta

21

si potrebbe usare un regular expression:

SELECT DISTINCT city 
FROM station 
WHERE city RLIKE '^[aeiouAEIOU].*[aeiouAEIOU]$' 
+0

100%, regex è sicuramente la strada da percorrere! Nota, questa sintassi è MySQL. –

7

Utilizzare un'espressione regolare.

WHERE name REGEXP '^[aeiou].*[aeiou]$' 

^ e $ ancora la partita per l'inizio e la fine del valore.

Nella mia prova, questo non utilizzare un indice sulla colonna name, quindi sarà necessario eseguire una scansione completa, come avrei

WHERE name LIKE 'a%a' OR name LIKE 'a%e' ... 

penso di farlo utilizzare un indice faresti è necessario utilizzare un'unione di query che testano ciascuna la prima lettera.

SELECT * FROM table 
WHERE name LIKE 'a%' AND name REGEXP '[aeiou]$' 
UNION 
SELECT * FROM table 
WHERE name LIKE 'e%' AND name REGEXP '[aeiou]$' 
UNION 
SELECT * FROM table 
WHERE name LIKE 'i%' AND name REGEXP '[aeiou]$' 
UNION 
SELECT * FROM table 
WHERE name LIKE 'o%' AND name REGEXP '[aeiou]$' 
UNION 
SELECT * FROM table 
WHERE name LIKE 'u%' AND name REGEXP '[aeiou]$' 
+0

Solo pura curiosità .. il motore è abbastanza intelligente da usare indici (invece di una scansione completa della tabella)? –

+0

Non penso, ma puoi controllare con 'EXPLAIN'. – Barmar

+1

Ho appena controllato uno dei miei tavoli, non ha usato un indice. – Barmar

3

Potresti sottostringa il primo e l'ultimo carattere e confrontarlo con IN parola chiave,

WHERE SUBSTRING(NAME,1,1) IN (a,e,i,o,u) AND SUBSTRING(NAME,-1) IN (a,e,i,o,u) 
+0

La query potrebbe richiedere virgolette singole per i caratteri all'interno della parentesi IN. –

0

In Oracle:

SELECT DISTINCT city 
FROM station 
WHERE SUBSTR(lower(CITY),1,1) IN ('a','e','i','o','u') AND SUBSTR(lower(CITY),-1) IN ('a','e','i','o','u'); 
0

In MSSQL, questo potrebbe essere il modo:

select distinct city from station 
where 
right(city,1) in ('a', 'e', 'i', 'o','u') and left(city,1) in ('a', 'e', 'i', 'o','u') 
0

Entrambe le seguenti affermazioni di lavoro in Microsoft SQL Server

SELECT DISTINCT 
    city 
FROM 
    station 
WHERE 
    SUBSTRING(lower(CITY), 1, 1) IN ('a', 'e', 'i', 'o', 'u') 
    AND SUBSTRING(lower(CITY), LEN(CITY), 1) IN ('a', 'e', 'i', 'o', 'u'); 

SELECT DISTINCT 
    City 
FROM 
    Station 
WHERE 
    City LIKE '[A, E, O, U, I]%[A, E, O, U, I]' 
ORDER BY 
    City; 
0
SELECT DISTINCT city 
FROM station 
WHERE city RLIKE '^[^aeiouAEIOU]'OR city RLIKE'[^aeiouAEIOU]$' 
+0

Scuse! la query sopra i risultati delle città che non hanno vocali come primo o ultimo carattere – Smita

+0

Si prega di provare la seguente: Seleziona città DISTINTO dalla stazione Dove Città RLIKE '^ [aeiouAEIOU]' O RLIKE città '[aeiouAEIOU] $' – Smita

+0

Prova pubblicare risposte a nuove domande. Questo è stato chiesto nel 2014 e ha già una risposta accettata. Le nuove domande richiedono di più la tua attenzione. –

6

in Microsoft SQL server è possibile raggiungere questo obiettivo dal basso interrogazione :

SELECT distinct City FROM STATION WHERE City LIKE '[AEIOU]%[AEIOU]' 

O

SELECT distinct City FROM STATION WHERE City LIKE '[A,E,I,O,U]%[A,E,I,O,U]' 
+0

Esiste una query abbreviata come questa per Oracle SQL? – Scott

0

Provare quanto segue:

select distinct city 
from station 
where city like '%[aeuio]'and city like '[aeuio]%' Order by City; 
+0

funziona per me –

0

Prova questo per principio con vocale

Oracle:

select distinct *field* from *tablename* where SUBSTR(*sort field*,1,1) IN('A','E','I','O','U') Order by *Sort Field*; 
0

Provare quanto segue:

select distinct city from station where city REGEXP '^[aeiou]' and city REGEXP '[aeiou]$'; 
1
SELECT distinct CITY 
FROM STATION 
where (CITY LIKE 'a%' 
    OR CITY LIKE 'e%' 
    OR CITY LIKE 'i%' 
    OR CITY LIKE 'o%' 
    OR CITY LIKE 'u%' 
) AND (CITY LIKE '%a' 
    OR CITY LIKE '%e' 
    OR CITY LIKE '%i' 
    OR CITY LIKE '%o' 
    OR CITY LIKE '%u' 
) 
1

Per l'accesso MS o server MySQL

SELECT city FROM station 
WHERE City LIKE '[aeiou]%'and City LIKE '%[aeiou]'; 
+0

Welcome to Stack Overflow. Mentre scrivo questo commento, qualcuno probabilmente sta già modificando il tuo post. La prossima volta che risponderai a una domanda, considera di incapsulare il codice nel blocco di codice. – FanaticD

2

Si può provare questo

select city 
    from station where SUBSTRING(city,1,1) in ('A','E','I','O','U') and 
    SUBSTRING(city,-1,1) in ('A','E','I','O','U'); 
1

La query di seguito farà per Orale DB:

select distinct(city) from station where upper(substr(city, 1,1)) in ('A','E','I','O','U') and upper(substr(city, length(city),1)) in ('A','E','I','O','U'); 
+1

Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione adeguata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore educativo mostrando * perché * questa è una buona soluzione al problema e renderebbe più utile ai futuri lettori con simili, ma non identiche, domande. Si prega di [modificare] la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. –

0

si può provare un semplice soluzione per MySQL:

SELECT DISTINCT city FROM station WHERE città REGEXP "^ [aeiou]. *";

0

Per Oracle:

SELECT DISTINCT city 
FROM station 
WHERE REGEXP_LIKE(city, '^[aeiouAEIOU].*[aeiouAEIOU]$') ; 
Problemi correlati