ماهو - اوراكل sql
SQL لإنشاء قائمة أرقام من 1 إلى 100 (8)
إجابة بيتر هي المفضلة لدي أيضًا.
إذا كنت تبحث عن المزيد من التفاصيل ، فهناك نظرة عامة جيدة ، here ،
المثير للاهتمام بشكل خاص هو قراءة benchmarks .
باستخدام جدول DUAL ، كيف يمكنني الحصول على قائمة أرقام من 1 إلى 100؟
إذا كنت تريد ربط الأعداد الصحيحة بين عددين صحيحين (أي البدء بشيء غير 1) ، فيمكنك استخدام شيء كالتالي:
with bnd as (select 4 lo, 9 hi from dual)
select (select lo from bnd) - 1 + level r
from dual
connect by level <= (select hi-lo from bnd);
يعطي:
4
5
6
7
8
باستخدام GROUP BY CUBE
:
SELECT ROWNUM
FROM (SELECT 1 AS c FROM dual GROUP BY CUBE(1,1,1,1,1,1,1) ) sub
WHERE ROWNUM <=100;
باستخدام عبارة مصنع استعلام فرعي من Oracle: "WITH" ، يمكنك تحديد الأرقام من 1 إلى 100:
WITH t(n) AS (
SELECT 1 from dual
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT * FROM t;
لقد قمت بإنشاء دالة Oracle تقوم بإرجاع جدول أرقام
CREATE OR REPLACE FUNCTION [schema].FN_TABLE_NUMBERS(
NUMINI INTEGER,
NUMFIN INTEGER,
EXPONENCIAL INTEGER DEFAULT 0
) RETURN TBL_NUMBERS
IS
NUMEROS TBL_NUMBERS;
INDICE NUMBER;
BEGIN
NUMEROS := TBL_NUMBERS();
FOR I IN (
WITH TABLA AS (SELECT NUMINI, NUMFIN FROM DUAL)
SELECT NUMINI NUM FROM TABLA UNION ALL
SELECT
(SELECT NUMINI FROM TABLA) + (LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) NUM
FROM DUAL
CONNECT BY
(LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) <= (SELECT NUMFIN-NUMINI FROM TABLA)
) LOOP
NUMEROS.EXTEND;
INDICE := NUMEROS.COUNT;
NUMEROS(INDICE):= i.NUM;
END LOOP;
RETURN NUMEROS;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NUMEROS;
WHEN OTHERS THEN
RETURN NUMEROS;
END;
/
ضروري إنشاء نوع بيانات جديد:
CREATE OR REPLACE TYPE [schema]."TBL_NUMBERS" IS TABLE OF NUMBER;
/
الاستعمال:
SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10))--integers difference: 1;2;.......;10
وإذا كنت بحاجة إلى أرقام عشرية بين الأرقام عن طريق التدوين الترفيهي:
SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-1));--with 0.1 difference: 1;1.1;1.2;.......;10
SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-2));--with 0.01 difference: 1;1.01;1.02;.......;10
هذه طريقة ممتعة لإنشاء جدول أرقام. لا يستخدم الجدول DUAL ، ولكن إذا اختفى الجدول DUAL ، فقد يكون هذا بمثابة خطة احتياطية.
DECLARE @TotalNumbers INT = 100;
DECLARE @From DATETIME = CONVERT(DATETIME, CONVERT(DATE, GETDATE())),
@To DATETIME = DATEADD(SECOND, @TotalNumbers - 1, CONVERT(DATETIME, CONVERT(DATE, GETDATE())));
WITH AlmostNumberTable (Hola)
AS (SELECT @From
UNION ALL
SELECT DATEADD(SECOND, 1, Hola)
FROM AlmostNumberTable
WHERE Hola< @To
)
SELECT [Number]
FROM
(
SELECT DATEPART(MINUTE, AlmostNumberTable.Hola) * 60 + DATEPART(SECOND, AlmostNumberTable.Hola) + 1 AS [Number]
FROM AlmostNumberTable
) AS NumberTable;
ربما يكون هذا هراء ، لكنه حل عملي وكان ممتعًا في الكتابة.
من الصعب فهم سؤالك ، ولكن إذا كنت تريد تحديد الأرقام من 1
إلى 100
، فيجب أن يؤدي ذلك إلى حل المشكلة:
Select Rownum r
From dual
Connect By Rownum <= 100