Gestern in einem Bewerbungsgespräch wurde mir diese Frage gestellt und ich hatte keine Ahnung davon. Angenommen, ich habe ein Wort "Manhattan". Ich möchte nur die Buchstaben "M", "A", "N", "H", "T" in SQL anzeigen. Wie es geht? Jede Hilfe wird geschätzt.Wie kann man einzelne Buchstaben eines Wortes in SQL aufteilen und anzeigen?
Antwort
Nun, hier ist meine Lösung (sqlfiddle) - es zielt darauf ab, eine "Relational SQL" -Operationen zu verwenden, die wurden, was der Interviewer konzeptionell ging.
Die meiste Arbeit ist einfach, um die Zeichenfolge in eine Reihe von (Pos, Brief) Aufzeichnungen zu verwandeln, da die relevante endgültige angewendet DQL ist eine bloße SELECT mit einer Gruppierung und Bestellung angewendet.
select letter
from (
-- All of this just to get a set of (pos, letter)
select ns.n as pos, substring(ss.s, ns.n, 1) as letter
from (select 'MANHATTAN' as s) as ss
cross join (
-- Or use another form to create a "numbers table"
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9)) as X(n)
) as ns
) as pairs
group by letter -- guarantees distinctness
order by min(pos) -- ensure output is ordered MANHT
Die obige Abfrage funktioniert in SQL Server 2008, aber die "Numbers Table" kann für andere Anbieter geändert werden müssen. Ansonsten wird nichts verwendet, das anbieterspezifisch ist - kein CTE oder eine Anwendung einer Funktion oder eines prozeduralen Sprachcodes.
Das oben Gesagte ist ein konzeptioneller Ansatz, für den SQL entwickelt wurde Sätze und Beziehungen und Multiplizität über Datensätze hinweg; das obige Beispiel ist in gewisser Hinsicht nur eine Perversion von solchem.
Prüfung der Zwischenbeziehung,
select ns.n as pos, substring(ss.s, ns.n, 1) as letter
from (select 'MANHATTAN' as s) as ss
cross join (
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9)) as X(n)
) as ns
verwendet ein cross join das kartesische Produkt der Saite (1 Zeile) mit den Zahlen (9 Zeilen) zu erzeugen; Die substring
Funktion wird dann mit der Zeichenfolge und jede Nummer angewendet, um jedes Zeichen in Übereinstimmung mit seiner Position zu erhalten.Der resultierende Satz enthält die Records-
POS LETTER
1 M
2 A
3 N
..
9 N
dann wird die äußere Auswahlgruppen jeder Datensatz auf den Buchstaben nach und die resultierenden Aufzeichnungen werden durch das Minimum (erste) Auftrittsposition des Briefes angeordnet, dass die Gruppierung zur Gründung. (Ohne die Reihenfolge durch die Briefe wäre eindeutig gewesen aber die endgültige Bestellung wäre nicht garantiert.)
Bitte entschuldigen Sie meinen Intellekt ... können Sie nur die Schritte bitte erklären? Ein wenig mehr – StrugglingCoder
@ user3655102 Ich habe ein bisschen mehr Erklärung hinzugefügt - hoffe, es klärt die Dinge auf. – user2864740
Ich wundere mich, warum Sie die '(7)' übersprungen haben, und ich denke Lösung ist für 9 Zeichen langes Wort nur. – sallushan
declare @charr varchar(99)
declare @lp int
set @charr='Manhattan'
set @lp=1
DECLARE @T1 TABLE (
FLD VARCHAR(max)
)
while(@lp<=LEN(@charr))
begin
if(not exists(select * from @T1 where FLD=(select SUBSTRING(@charr,@lp,1))))
begin
insert into @T1
select SUBSTRING(@charr,@lp,1)
end
set @[email protected]+1
end
select * from @T1
Check dies kann es u
Ja, aber wird es verschiedene auswählen? d. h. A würde 2 mal kommen. T würde auch zweimal kommen. Recht? – StrugglingCoder
Ich habe meine Antwort geändert chk jetzt –
Stellen Sie sicher, um welche SQL-Implementierung (en) dies funktioniert zu spezifizieren. – user2864740
Ein Weg helfen (wenn SQL Server) mit einem recursive CTE (Commom Table Expression) ist.
DECLARE @source nvarchar(100) = 'MANHATTAN'
;
WITH cte AS (
SELECT SUBSTRING(@source, 1, 1) AS c1, 1 as Pos
WHERE LEN(@source) > 0
UNION ALL
SELECT SUBSTRING(@source, Pos + 1, 1) AS c1, Pos + 1 as Pos
FROM cte
WHERE Pos < LEN(@source)
)
SELECT DISTINCT c1 from cte
SqlFiddle for this is here. Ich musste die @source
für SqlFiddle inline, aber der obige Code funktioniert gut in Sql Server. Die erste SELECT
generiert die erste Zeile (in diesem Fall 'M', 1). Der zweite SELECT
ist der rekursive Teil, der die nachfolgenden Zeilen generiert, wobei die Pos
Spalte jedes Mal inkrementiert wird, bis die Beendigungsbedingung WHERE Pos < LEN(@source)
schließlich erfüllt ist. Die letzte Auswahl entfernt die Duplikate. Intern sortiert SELECT DISTINCT
die Zeilen, um das Entfernen von Duplikaten zu erleichtern, weshalb die endgültige Ausgabe in alphabetischer Reihenfolge erfolgt. Da Sie die Reihenfolge nicht als Anforderung angegeben haben, habe ich sie unverändert belassen. Aber Sie könnten es ändern, um stattdessen eine GROUP
zu verwenden, die auf MIN(Pos)
bestellt wurde, wenn Sie die Ausgabe in der ursprünglichen Reihenfolge der Zeichen benötigten.
Dieselbe Technik kann für Dinge wie das Generieren aller Bigrams für eine Zeichenfolge verwendet werden, mit einer kleinen Änderung der allgemeinen Struktur oben.
Hier ist eine Oracle-Version von @ user2864740 's Antwort. Der einzige Unterschied ist, wie Sie die „Zahlen Tabelle“ (plus geringfügige Unterschiede in Aliasing)
select letter
from (
select ns.n as pos, substr(ss.s, ns.n, 1) as letter
from (select 'MANHATTAN' as s from dual) ss
cross join (
SELECT LEVEL as n
FROM DUAL
CONNECT BY LEVEL <= 9
ORDER BY LEVEL) ns
) pairs
group by letter
order by min(pos)
- 1. Zeichenfolge in Buchstaben aufteilen
- 2. Wie kann man einen Buchstaben auf einmal einblenden/anzeigen?
- 3. vim: Wie ändert man ein paar letzte Buchstaben des Wortes?
- 4. Wörter in Buchstaben in Java aufteilen
- 5. Erhalten Sie den ersten Buchstaben eines Wortes in Zeichenfolge und halten Sie andere gleich
- 6. VBScript - Großbuchstaben ersten Buchstaben jedes Wortes
- 7. Aufteilen einer Zeichenfolge in einzelne Variablen
- 8. Wie ersten Buchstaben jedes Wortes in der Zeichenfolge
- 9. SQL Aufteilen und Zusammenführen String
- 10. SQL Groß- und Kleinschreibung ersten und letzten Buchstaben eines Namens
- 11. Notepad ++ Capitalize jeden ersten Buchstaben jedes Wortes
- 12. In CSS/SVG, wie man jedes Zeichen eines Wortes dreht?
- 13. Wie kann man einen SpannableStringBuilder aufteilen und gleichzeitig formatieren?
- 14. kann keine griechischen Buchstaben im Browser anzeigen
- 15. Definieren eines Wortes in PHP
- 16. Wie deaktiviere ich den Buchstabenschwanz vom letzten Buchstaben eines Wortes in CSS?
- 17. Binäre Suche eines Wortes
- 18. Wie man einzelne Einträge innerhalb einer Spalte eines data.frame
- 19. Wie kann man nicht alle Frequenzen im Balkendiagramm anzeigen und in R in derselben Kategorie gruppieren?
- 20. Wie kann ich den ersten Buchstaben jedes Wortes in einer Zeichenfolge in Perl groß schreiben?
- 21. Wie wähle ich einzelne Wörter eines camelisierten Wortes in IntelliJ IDEE
- 22. Wie man den ersten und letzten Buchstaben Großbuchstaben in ein Wort schreibt (daher mehrere Strings) php
- 23. Wie erstellt man einen regulären Ausdruck, um das Ende eines Wortes in Java zu finden?
- 24. SQL - wie Wörter mit bestimmten Werten am Ende des Wortes
- 25. change Farbe eines Wortes in einer Präferenzzusammenfassung
- 26. Wie konvertiert man Buchstaben in Array in PHP
- 27. Aufteilen eines Arrays in Gruppen
- 28. Wie kann man Unterlisten k-mal in Unterlisten aufteilen? (Python)
- 29. Vue.js Modell anzeigen und in verschiedene Dateien aufteilen
- 30. Aufteilen eines ReportLab Flowable
konstruieren würde ich wahrscheinlich eine gespeicherte Prozedur schreiben, dies zu tun, aber nur, wenn ich habe SQL zu verwenden. Ansonsten würde ich eine tatsächliche Programmiersprache verwenden. – Ellesedil
Aktuelle Programmiersprachen machen diesen Job einfacher. Aber wie geht das in SQL? Bitte zeig es mir durch. – StrugglingCoder
Für * welche * SQL-Implementierung? – user2864740