2015-12-21 7 views
9

Staram się wybierać i przyciąć wszystkie wpisy z tabeli za pomocą następującej klauzuli:Czy istnieje sposób na wyzerowanie wszystkich danych w instrukcji SELECT * FROM?

SELECT TRIM(*) FROM TABLE 

Ale pojawia się błąd. Czy istnieje sposób na zwrócenie wszystkich wybranych pozycji, aby zostały przycięte na puste znaki na początku i na końcu każdego ciągu?

+3

Odpowiedź brzmi: nie. Ale dlaczego przechowujesz wiodące/końcowe spacje? – jarlh

+6

I dodanie innej myśli: SELECT * jest złe. Nigdy nie można ufać, że kolumny będą z czasem takie same, więc format wyjściowy ulegnie zmianie, a aplikacja może zostać zerwana. Zamiast tego użyj jawnej listy kolumn dla SELECT. – frlan

+1

http://stackoverflow.com/questions/507869/trim-all-database-fields Sprawdź ten link –

Odpowiedz

10

Musisz podać każdą kolumnę ciąg ręcznie:

SELECT TRIM(col1),  --LTRIM(RTRIM(...)) If RDBMS is SQL Server 
     TRIM(col2), 
     TRIM(col3), 
     TRIM(col4) 
     -- ... 
FROM table 

Jest jeszcze inny problem z propozycji. * jest symbolem zastępczym dla każdej kolumny w tabeli, więc będzie problem z przycinaniem date/decimal/spatial data ....

Uzupełnienie

Korzystanie Oracle 18c Polymorphic Table Functions (kod podany jest tylko PoC, jest miejsce dla wielu ulepszeń):

CREATE TABLE tab(id INT, d DATE, 
       v1 VARCHAR2(100), v2 VARCHAR2(100), v3 VARCHAR2(100)); 

INSERT INTO tab(id, d,v1, v2, v3) 
VALUES (1, SYSDATE, ' aaaa ', '  b ', ' c'); 
INSERT INTO tab(id, d,v1, v2, v3) 
VALUES (2, SYSDATE+1, ' afasd', ' ', ' d'); 
COMMIT; 

SELECT * FROM tab; 
-- Output 
.----.-----------.-----------.-----------.-----. 
| ID |  D  | V1  | V2  | V3 | 
:----+-----------+-----------+-----------+-----: 
| 1 | 02-MAR-18 | aaaa |  b | c | 
:----+-----------+-----------+-----------+-----: 
| 2 | 03-MAR-18 |  afasd |   | d | 
'----'-----------'-----------'-----------'-----' 

i funkcja tabela:

CREATE OR REPLACE PACKAGE ptf AS 
    FUNCTION describe(tab IN OUT dbms_tf.table_t)RETURN dbms_tf.describe_t;  
    PROCEDURE FETCH_ROWS; 
END ptf; 
/
CREATE OR REPLACE PACKAGE BODY ptf AS 
    FUNCTION describe(tab IN OUT dbms_tf.table_t) RETURN dbms_tf.describe_t AS 
    new_cols DBMS_TF.COLUMNS_NEW_T; 
    BEGIN 
    FOR i IN 1 .. tab.column.count LOOP 
     IF tab.column(i).description.type IN (dbms_tf.type_varchar2) THEN 
      tab.column(i).pass_through:=FALSE; 
      tab.column(i).for_read:= TRUE; 
      NEW_COLS(i) := 
       DBMS_TF.COLUMN_METADATA_T(name=> tab.column(i).description.name, 
             type => tab.column(i).description.type); 
     END IF; 
    END LOOP; 
    RETURN DBMS_TF.describe_t(new_columns=>new_cols, row_replication=>true); 
    END; 

    PROCEDURE FETCH_ROWS AS 
    inp_rs DBMS_TF.row_set_t; 
    out_rs DBMS_TF.row_set_t; 
    rows PLS_INTEGER; 
    BEGIN 
    DBMS_TF.get_row_set(inp_rs, rows); 
    FOR c IN 1 .. inp_rs.count() LOOP 
     FOR r IN 1 .. rows LOOP 
      out_rs(c).tab_varchar2(r) := TRIM(inp_rs(c).tab_varchar2(r)); 
     END LOOP; 
    END LOOP; 
    DBMS_TF.put_row_set(out_rs, replication_factor => 1); 
    END; 
END ptf; 

I ostateczne wezwanie :

CREATE OR REPLACE FUNCTION trim_col(tab TABLE) 
RETURN TABLE pipelined row polymorphic USING ptf; 

SELECT * 
FROM trim_col(tab); -- passing table as table function argument 

.----.-----------.-------.-----.----. 
| ID |  D  | V1 | V2 | V3 | 
:----+-----------+-------+-----+----: 
| 1 | 02-MAR-18 | aaaa | b | c | 
:----+-----------+-------+-----+----: 
| 2 | 03-MAR-18 | afasd | - | d | 
'----'-----------'-------'-----'----' 
+2

Dlaczego downvoting? Odpowiedź jest poprawna. – jarlh

+0

Dzięki za downvotes. Będę czekać na rozwiązanie Dynamic-SQL, które będzie działać dla każdego RDBMS, sprawdzać metadane i robić przycinanie dla kolumn ciągów. – lad2025

+1

Jedna sztuczka, aby zrobić to szybciej w "SSMS", to przeciągnąć i upuścić z eksploratora obiektów wszystkie kolumny do okna zapytania. Następnie przenieś wszystkie kolumny łańcuchów na początku, użyj wyboru bloku i napisz 'TRIM (' dla wielu kolumn na raz, następnie przejdź do końca linii, zaznacz blok i zamknij brakujące ')'. SQL Server ma 'LTRIM (RTRIM (' zamiast 'TRIM'. – lad2025

Powiązane problemy