[ Zidar @ 24.05.2012. 21:26 ] @
Imam u tablei kolonu Ime, varchar (15) NOT NULL

NOT NULL mi nije dovopljan uslov. Ne zelim da cuvam:
a) prazan string
b) string koji se sastoji samo od znakova razmaka

Napisati CHECK CONSTRAINT, ili vise njih, koji sprecavaju da se unese a) prazan string i b) string koji se sastoji samo od znakova razmaka.

Izvolite
[ Igor Gajic @ 24.05.2012. 21:38 ] @
Test okruzenje => SQL SERVER 2008 R2

Code (sql):

CREATE TABLE test(
Ime VARCHAR (15) NOT NULL
CHECK (LEN(Ime) != 0)
)

-- test cases

INSERT INTO test VALUES ('');
INSERT INTO test VALUES ('    ');
INSERT INTO test VALUES ('x');
INSERT INTO test VALUES ('    x');
INSERT INTO test VALUES (' x   x');

 



Deluje mi suvise prosto za mozgalicu...
[ Zidar @ 24.05.2012. 22:02 ] @
Igorovo resenje se prihvata, cestitam.

Ima li jos neko resenje, nesto recimo sa LIKE, ili nesto sto ne upotrebljava funkcije? Cisto da vidimo sta sve moze da se uradi.

Znam da Joe Celko, covek koji je napisao neke od najboljih knjiga o SQL, za ovakve slucajeve nudi ovo:
Code:

CHECK Ime NOT IN ('',' ','  ', '   ','    ','     ','      ','       ','        ','         ','          ','           ','           ','            ','             ','              ','               ')


Sto se tice tezine, i ja sam mislio da je pitanje lako, ali kad sam pitao moje programere ovde da to rese, bar pola nije imalo pojma.

[ Zidar @ 24.05.2012. 22:16 ] @
Kad vec spomenusmo programere, evo jednog odgovora:
Citat:
I wrote a function to handle this. I want other developers to be able to reuse the logic without having to write the if/then statements for the hundreds of fields I need to apply this to.

Code:

CREATE FUNCTION convertEmptyStringToNull(@FieldName varchar(100))
RETURNS varchar(100)AS
BEGIN   
DECLARE @convertEmptyStringToNull varchar(100)   
 IF LEN(LTRIM(@FieldName)) > 0        
Set @convertEmptyStringToNull = @FieldName    
ELSE        Set @convertEmptyStringToNull = NULL   
 RETURN(@convertEmptyStringToNull)
END


Ko razume, shvatice... Ja nisma razumeo zasto treba korisnicak funkcija, i zasto da pretvara prazan string u NULL, ali eto, neko je seo i napisao ovakav kod. Ne prihvata se kao resenje jer je nebulozno.
[ djoka_l @ 24.05.2012. 22:22 ] @
Odmah prigivor

Za Oracle je prazan string NULL, tako da NOT NULL klauzula uključuje i prazne stringove.

Evo sesije:



Evo i komande za ograničenje da su zabranjeni prazni stringovi
Code (sql):

ALTER TABLE tablei ADD CONSTRAINT tablei_con
CHECK (REPLACE(ime, ' ', '') IS NOT NULL);
 
[ Zidar @ 25.05.2012. 15:20 ] @
Moze i bez funkcija, barem u MS SQL 2000/2005
Code:

IF Object_ID('test') IS NOT NULL DROP TABLE test
;
CREATE TABLE test( 
Broj int identity
, Ime varchar (15) NOT NULL
CONSTRAINT ck_NoOnlySpaces CHECK (IME  like '%[^ ]%')
)

-- test cases
INSERT INTO test (Ime)  VALUES ('');    -- Ne prolazi
INSERT INTO test (Ime)   VALUES ('    ');    -- Ne prolazi

-- Prolazi
INSERT INTO test (Ime)   VALUES ('x');            -- OK
INSERT INTO test (Ime)   VALUES ('    x');        -- OK
INSERT INTO test (Ime)   VALUES (' x   x');        -- OK
INSERT INTO test (Ime)   VALUES ('x   x     ');    -- OK
;

SELECT
Broj, '>'+Ime+'<'
FROM test
;

       Broj 
----------- -----------------
          2 >x<
          3 >    x<
          4 > x   x<
          5 >x   x     <

(4 row(s) affected)


Treba ukucati u Google 'SQL Pattren matching'

http://manuals.sybase.com/onli...ric__BookTextView/6605;pt=7889

IME like '%[^ ]%' znaci 'mora da ima bar neki karakter koji nije space' i na testitanju se pokazalo da radi i za zero length string.

:-)
[ Igor Gajic @ 25.05.2012. 20:15 ] @
Mala varijacija

Code (sql):

CREATE TABLE test(
 Ime VARCHAR (15) NOT NULL
CHECK (LTRIM(Ime) != '')
)
 


Postoji pitanje brzine upisa u tabelu sa proverom koja je resena preko regularnog izraza. Pogotovo kod tabela kod kojih postoji dosta upisa.