Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase

Hi frn Expand / Collapse
Author
Message
Posted Monday, December 17, 2012 7:54 PM
Forum Newbie

Forum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum Newbie

Group: General Forum Members
Last Login: Wednesday, April 24, 2013 1:55 PM
Points: 2, Visits: 65
I have table CREATE TABLE #varchar_field1 ( ID INT IDENTITY(1,1), mixed_field VARCHAR(100), )
INSERT INTO #varchar_field1 (mixed_field) SELECT '1' UNION ALL SELECT '4.9' UNION ALL SELECT '10'
UNION ALL SELECT '50' UNION ALL SELECT '6' UNION ALL SELECT 'a'

UNION ALL SELECT 'z' UNION ALL SELECT 'A'
--------output----
1 1
2 4.9
5 6
3 10
4 50
6 a
8 A
7 z


Result should be
ID mixed_field
1 1
2 4.9
3 10
4 50
5 6
6 a
7 z
8 A

How can I get results like that. Please anyone help me to retrieve result.Thank you
Post #1397519
Posted Monday, December 17, 2012 8:55 PM


SSC Journeyman

SSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC Journeyman

Group: General Forum Members
Last Login: Today @ 2:15 PM
Points: 79, Visits: 280
There is not guarantee to order with a union or selecting from a heap.

Use separate inserts to make sure order is preserved as below.

-- Create table
CREATE TABLE #varchar_field1
(
ID INT IDENTITY(1,1),
mixed_field VARCHAR(100)
);
GO

-- Insert in order (old way)
INSERT INTO #varchar_field1 (mixed_field) values ('1');
INSERT INTO #varchar_field1 (mixed_field) values ('14.9');
INSERT INTO #varchar_field1 (mixed_field) values ('10');
INSERT INTO #varchar_field1 (mixed_field) values ('50');
INSERT INTO #varchar_field1 (mixed_field) values ('6');
INSERT INTO #varchar_field1 (mixed_field) values ('a');
INSERT INTO #varchar_field1 (mixed_field) values ('z');
INSERT INTO #varchar_field1 (mixed_field) values ('A');
GO

-- Truncate table to reset id
truncate table #varchar_field1;
GO

-- New syntax for tuples (should preserve order like above)
INSERT INTO #varchar_field1 (mixed_field) values
('1'),
('14.9'),
('10'),
('50'),
('6'),
('a'),
('z'),
('A');

Please check the TSQL syntax since I did not execute in SSMS.



John Miner
Crafty DBA
www.craftydba.com
Post #1397529
Posted Monday, December 17, 2012 9:58 PM
Forum Newbie

Forum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum Newbie

Group: General Forum Members
Last Login: Thursday, December 20, 2012 4:23 PM
Points: 1, Visits: 22
Hi Miner,
I already made #table and I got result ID mixed_field
1 1
2 4.9
3 10
4 50
5 6
6 a
7 z
8 A
Thank you for your Answer but I need Result below:

ID Mixed_field
1 1
2 4.9
5 6
3 10
4 50
6 a
8 A
7 z
Post #1397538
Posted Monday, December 17, 2012 11:04 PM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Today @ 6:07 PM
Points: 2,340, Visits: 3,167
Not very elegant but you might be able to use something like this, assuming your intent is to sort numbers first as numbers followed by non-numeric characters:

CREATE TABLE #varchar_field1 ( ID INT IDENTITY(1,1), mixed_field VARCHAR(100) )

INSERT INTO #varchar_field1 (mixed_field)
SELECT '1' UNION ALL SELECT '4.9' UNION ALL SELECT '10'
UNION ALL SELECT '50' UNION ALL SELECT '6' UNION ALL SELECT 'a'
UNION ALL SELECT 'z' UNION ALL SELECT 'A'

SELECT *
FROM #varchar_field1
ORDER BY CASE WHEN PATINDEX('[a-zA-Z]', mixed_field) > 0
THEN mixed_field
ELSE '' END
,CASE WHEN PATINDEX('[a-zA-Z]', mixed_field) > 0
THEN 0
ELSE CAST(mixed_field AS DECIMAL(10,1)) END

DROP TABLE #varchar_field1





No loops! No CURSORs! No RBAR! Hoo-uh!

INDEXing a poor-performing query is like putting sugar on cat food. Yeah, it probably tastes better but are you sure you want to eat it?

Need to UNPIVOT? Why not CROSS APPLY VALUES instead?
Since random numbers are too important to be left to chance, let's generate some!
Are you too recursively challenged?
Splitting strings based on patterns can be fast!
Post #1397560
Posted Tuesday, December 18, 2012 12:24 AM


Ten Centuries

Ten CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen Centuries

Group: General Forum Members
Last Login: Today @ 12:37 AM
Points: 1,047, Visits: 1,439
dwain.c (12/17/2012)
Not very elegant but you might be able to use something like this, assuming your intent is to sort numbers first as numbers followed by non-numeric characters:

CREATE TABLE #varchar_field1 ( ID INT IDENTITY(1,1), mixed_field VARCHAR(100) )

INSERT INTO #varchar_field1 (mixed_field)
SELECT '1' UNION ALL SELECT '4.9' UNION ALL SELECT '10'
UNION ALL SELECT '50' UNION ALL SELECT '6' UNION ALL SELECT 'a'
UNION ALL SELECT 'z' UNION ALL SELECT 'A'

SELECT *
FROM #varchar_field1
ORDER BY CASE WHEN PATINDEX('[a-zA-Z]', mixed_field) > 0
THEN mixed_field
ELSE '' END
,CASE WHEN PATINDEX('[a-zA-Z]', mixed_field) > 0
THEN 0
ELSE CAST(mixed_field AS DECIMAL(10,1)) END

DROP TABLE #varchar_field1




Hi Dwaine,

The solution seems to work pretty well...I haven't used something like this before....could you explain the Order By part of the query a little.....would love to see.


Vinu Vijayan

For better and faster solutions please check..."How to post data/code on a forum to get the best help" - Jeff Moden
Post #1397585
Posted Tuesday, December 18, 2012 12:36 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Today @ 6:07 PM
Points: 2,340, Visits: 3,167
I can try.

The ORDER BY is split into two levels:
1. First the characters, which get assigned the empty string when the value is a numeric (which will sort before any characters).
2. Then the numbers, which I've converted to a number so they sort in numeric sequence.



No loops! No CURSORs! No RBAR! Hoo-uh!

INDEXing a poor-performing query is like putting sugar on cat food. Yeah, it probably tastes better but are you sure you want to eat it?

Need to UNPIVOT? Why not CROSS APPLY VALUES instead?
Since random numbers are too important to be left to chance, let's generate some!
Are you too recursively challenged?
Splitting strings based on patterns can be fast!
Post #1397587
Posted Tuesday, December 18, 2012 8:19 AM


SSC Journeyman

SSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC Journeyman

Group: General Forum Members
Last Login: Today @ 2:15 PM
Points: 79, Visits: 280
Well you did not specify that it was not sorting in the order you wanted, numeric first by value, character next. It sounded like it was an issue with inserts into a heap. My bad.



John Miner
Crafty DBA
www.craftydba.com
Post #1397832
Posted Tuesday, December 18, 2012 8:29 AM


SSCoach

SSCoachSSCoachSSCoachSSCoachSSCoachSSCoachSSCoachSSCoachSSCoachSSCoachSSCoach

Group: General Forum Members
Last Login: Monday, May 06, 2013 1:09 PM
Points: 15,439, Visits: 9,569
If you want to force the order by using the ID column, then force the ID column to have the values you want:

CREATE TABLE #varchar_field1
(ID INT IDENTITY(1, 1),
mixed_field VARCHAR(100));

SET IDENTITY_INSERT #varchar_field1 ON;

INSERT INTO #varchar_field1
(ID, mixed_field)
VALUES (1, '1'),
(2, '4.9'),
(3, '10'),
(4, '50'),
(5, '6'),
(6, 'a'),
(7, 'z'),
(8, 'A');

SET IDENTITY_INSERT #varchar_field1 OFF;

SELECT *
FROM #varchar_field1
ORDER BY ID;

Want to change the order? Change the insert so you have the right value with the right sequence (ID). Simple.

Even simpler, don't define an ID column. Define a "Sequence" column:

IF OBJECT_ID(N'tempdb..#varchar_field1') IS NOT NULL 
DROP TABLE #varchar_field1;

CREATE TABLE #varchar_field1
(Sequence INT,
mixed_field VARCHAR(100));

INSERT INTO #varchar_field1
(Sequence, mixed_field)
VALUES (1, '1'),
(2, '4.9'),
(3, '10'),
(4, '50'),
(5, '6'),
(6, 'a'),
(7, 'z'),
(8, 'A');

SELECT *
FROM #varchar_field1
ORDER BY Sequence;

That makes it clear what the column is being used for, and doesn't require Identity_Insert to be set to On.


- Gus "GSquared", RSVP, OODA, MAP, NMVP, FAQ, SAT, SQL, DNA, RNA, UOI, IOU, AM, PM, AD, BC, BCE, USA, UN, CF, ROFL, LOL, ETC
Property of The Thread

"Nobody knows the age of the human race, but everyone agrees it's old enough to know better." - Anon
Post #1397842
« Prev Topic | Next Topic »

Add to briefcase

Permissions Expand / Collapse