webForumDet fria alternativet

substring i select

9 svar · 432 visningar · startad av CokeLight

CokeLightMedlem sedan juni 2000504 inlägg
#1

Hejsan, jag skulle vilja plocka ut allt som står före @ tecknet för alla poster i en tabell.. det går för en en post i taget om jag sätter WHERE id = 3 men hur gör man för hela SELECT'n...?

SELECT SUBSTRING(epost, 1, 
(
	(SELECT CHARINDEX('@', epost) FROM personal WHERE id IN (SELECT epost FROM personal)) - 1)
) FROM personal

ger mig följande fel:

Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'xyz.abc@123.se' to a column of data type int.

SELECT SUBSTRING(epost, 1, 
(
	(SELECT CHARINDEX('@', epost) FROM personal WHERE id = 3) - 1)
) FROM personal WHERE id = 3

funkar ju men jag vill ha en loop..? :)

@ndersMedlem sedan juni 200032 969 inlägg
#2

Problemet är:

... WHERE [b]id[/b] IN (SELECT [b]epost[/b]

Vad vill du med det villkoret egentligen?

CokeLightMedlem sedan juni 2000504 inlägg
#3

hejsan @nders.. :) jag gissade bara iofs.. om jag bara skriver

SELECT SUBSTRING(epost, 1, 
(
	(SELECT CHARINDEX('@', epost) FROM personal) - 1)
) FROM personal

får jag felet:

Server: Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

men jag läste fel helt och hållet kom jag ju på.. jag fick för mig att det stod nåt i stil med att Subquery BARA returnerade ett värde och att flera värden måste returneras i sammanhanget o provade därför med "IN".. men det blev ju galet hursomhelst... :) några förslag..?

@ndersMedlem sedan juni 200032 969 inlägg
#4

Jag förstår inte riktigt varför du ska ha en subquery överhuvudtaget?

SELECT SUBSTRING(epost, 1, CHARINDEX('@', epost)) AS foo FROM personal
CokeLightMedlem sedan juni 2000504 inlägg
#5

hehe.. absolut.. ! vet inte vad jag tänkte på.. sitter o nickar till här borta.. halvsovande.. (fredag o allt ;) gracias.. !!

CokeLightMedlem sedan juni 2000504 inlägg
#6

hej igen.. lite följdfrågor..

nu vill jag göra insert i en kolumn baserad på den SELECT'en jag frågade om tidigare...

så när jag skriver:

INSERT INTO personal(id, .... , abc)
(select id, ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old)

(där personal_old är en exakt replica av personal).

får jag felmeddelande:

Server: Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'personal' when IDENTITY_INSERT is set to OFF.

... så jag tänkte att jag deletar allt från personal först:

delete personal cascade constraint
drop table personal cascade constraint

men cascade constraint funkar inte riktigt här.. (har för mig att det gick i Oracle..?)

(jag kör så här eftersom jag inte vet enklare sätt.. :) ) Jag provade även att göra UPDATE men kom inte på hur jag skulle skriva UPDATE..

UPDATE personal SET xyz = 
(
	SELECT SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) AS xyz FROM personal_old WHERE epost <> ''
) 
WHERE personal.id = personal_old.id

felmsg:

Server: Msg 107, Level 16, State 3, Line 1
The column prefix 'personal_old' does not match with a table name or alias name used in the query.

så jag har inga fler idéer.. så hur kan jag göra en insert/update med dessa värden...??

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Om du vill ha samma id-nummer i personal som du har i personal_old

set identity_insert on
INSERT INTO personal(id, .... , abc)
select id, ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old
set identity_insert off

Om du vill ha nya id-värden

INSERT INTO personal( .... , abc)
select  ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old

Om du vill ta bort alla rader ur en tabell

delete from personal
UPDATE personal SET xyz = 
(SELECT SUBSTRING(epost, 1, (CHARINDEX('@', epost)-1) ) 
FROM personal_old 
WHERE epost <> ''
and personal.id = personal_old.id)
where id in (select id from personal_old)
CokeLightMedlem sedan juni 2000504 inlägg
#8

hej hej.. kom hem precis.. ah, UPDATE satsen längst ner är lysande.. fungerade på en gång !! :) jättebra.. tack

orsaken varför jag provade att ha cascade constraint var att jag fick felet

Server: Msg 547, Level 16, State 1, Line 1
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_plats_personal'. The conflict occurred in database 'Personal', table 'plats', column 'Personal_Id'.
The statement has been terminated.

och har för mig att det där cascade constraint, på nåt sätt, vet inte exakt varför, men att det kringgick eventuella integrity checks (?)

aha.. det var bra.. att man skrev set identity insert on.. oki..

och.. är det så att om man inte har "WHERE id IN..." på slutet så kommer det att stå att personal_old inte finns med i queryn, eller..? För det felmeddelandet fick jag förut när jag satt o testade o kom inte på hur man skulle göra..

men bra.. då lärde jag mig mycket idag :)

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Det fel du får beror på en konflikt på grund av en foreign key. Du försöker ta bort en post som refereras från en annan tabell. Du kan få de posterna att tas bort automatiskt vid delete i huvudtabellen om du definierar din foreign key med on delete cascade. Det är inget som kan styras när man gör delete.

cascade kan enbart anges vid drop/revoke. SQL server stöder inte cascade alls. Varianten med cascade constraints är icke-standard och finns enbart i Oracle.

Att jag har med

where id in ( ...)

i update är enbart för att inte uppdatera de poster som inte finns med i personal_old

CokeLightMedlem sedan juni 2000504 inlägg
#10

aha.. okay, så man ska specificera on delete kommando..

bra.. då förstår jag också where id in.. tack så mycket för svaren.. :)

130 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)