Zunächst, wenn einige komplexe Logik zu schreiben entscheiden, was Sie brauchen, um herauszufinden, welche Werkzeuge zur Verfügung stehen. String-Manipulationen, um Zahlen zu verarbeiten, sollten Code-Geruchsalarmglocken in allen Sprachen auslösen.
Sie können hier bis zu verschiedenen SQL Server-Funktionen lesen: https://docs.microsoft.com/en-us/sql/t-sql/functions/mathematical-functions-transact-sql
Sie können auch im Internet nach Lösungen suchen. Ich hatte für "Finden Sie SQL Server Anzahl der Stellen in der Zahl" zu suchen, um diesen Artikel zu finden: Counting the number of digits in column
Der Code:
DECLARE @Sample TABLE (Num1 INT, Num2 INT)
INSERT INTO @Sample
VALUES(1123457, -1124678), (-1223457, 1124678), (-1223457, -1124678), (0, 0)
;WITH Step1 AS(
-- Determine Number properties
SELECT Num1, Num2, ABS(Num1) AS Num1Abs, ABS(Num2) AS Num2Abs,
SIGN(Num1) AS Num1Sign,
SIGN(Num2) AS Num2Sign,
(CASE WHEN LEN(ABS(Num1)) = LEN(ABS(Num2)) THEN 1 ELSE 0 END) AS LenMatchFlag
FROM @Sample
),
Step2 AS(
-- Find all possible significant digit matches of two numbers
SELECT Num1, Num2, Num1Abs, Num2Abs, Num1Sign, Num2Sign, NumDigits,
ROW_NUMBER() OVER(PARTITION BY Num1Abs, Num2Abs ORDER BY NumDigits ASC) AS BestMatch
FROM Step1
-- Possible number of significant digits
CROSS JOIN (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS NumLengths(NumDigits)
WHERE
LenMatchFlag = 1
AND Num1Sign = Num2Sign * -1 AND Num1Sign <> 0
AND ROUND(Num1Abs, -NumDigits, 1) = ROUND(Num2Abs, -NumDigits, 1)
),
Step3 AS(
-- Return the best match, and calculate outpu values
SELECT ((Num1Abs - ROUND(Num1Abs, -NumDigits, 1)) * Num1Sign) AS NewNum1,
((Num2Abs - ROUND(Num2Abs, -NumDigits, 1)) * Num2Sign) AS NewNum2,
*
FROM Step2
WHERE BestMatch = 1
)
SELECT 'Changed', NewNum1, NewNum2, Num1, Num2
FROM Step3
UNION ALL
SELECT 'UnChanged', Num1, Num2, Num1, Num2
FROM Step1
WHERE NOT(
LenMatchFlag = 1
AND Num1Sign = Num2Sign * -1 AND Num1Sign <> 0
)
Ausgang:
NewNum1 NewNum2 Num1 Num2
--------- ----------- ----------- ----------- -----------
Processed 3457 -4678 1123457 -1124678
Processed -223457 124678 -1223457 1124678
UnChanged -1223457 -1124678 -1223457 -1124678
UnChanged 0 0 0 0
Hinweis: Wenn Wenn Sie Nummern mit mehr als 9 Ziffern haben, müssen Sie weitere Werte zu NumLengths
Liste hinzufügen
Hinweis2: um zu sehen, welche Werte von jedem Berechnungsschritt zurückgegeben werden, können Sie die letzte SELECT
ändern, um eine bestimmte Tabelle, z. SELECT * FROM Step1
Konnten Sie Ihren vorhandenen Code bekannt geben? – Cowthulhu
können Sie bitte einige Beispieldaten und gewünschte Ergebnisse posten .. nur um klar zu sein, was Sie erreichen wollen .. – Harry
Es ist definitiv ein effizienter, dies zu erreichen, und versuchen Sie definitiv while Schleifen in SQL zu vermeiden. Ich werde versuchen, dir eine Antwort zu geben. – DaniDev